Merge "Check if sandbox is prepared before mounting pkg specific dirs."
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index 5a65028..0ef4f87 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -647,6 +647,23 @@
 static void PreparePkgSpecificDirs(const std::vector<std::string>& packageNames,
                                    const std::vector<std::string>& volumeLabels,
                                    bool mountAllObbs, userid_t userId, fail_fn_t fail_fn) {
+    if (volumeLabels.size() > 0) {
+        std::string sandboxDataDir = StringPrintf("/storage/%s", volumeLabels[0].c_str());
+        if (volumeLabels[0] == "emulated") {
+            StringAppendF(&sandboxDataDir, "/%d", userId);
+        }
+        StringAppendF(&sandboxDataDir, "/Android/data/%s", packageNames[0].c_str());
+        struct stat sb;
+        if (TEMP_FAILURE_RETRY(lstat(sandboxDataDir.c_str(), &sb)) == -1) {
+            if (errno == ENOENT) {
+                ALOGD("Sandbox not fully prepared for %s", sandboxDataDir.c_str());
+                return;
+            } else {
+                fail_fn(CREATE_ERROR("Failed to lstat %s: %s",
+                                     sandboxDataDir.c_str(), strerror(errno)));
+            }
+        }
+    }
     for (auto& label : volumeLabels) {
         std::string mntSource = StringPrintf("/mnt/runtime/write/%s", label.c_str());
         std::string mntTarget = StringPrintf("/storage/%s", label.c_str());