Loading cmds/installd/InstalldNativeService.cpp +18 −18 Original line number Original line Diff line number Diff line Loading @@ -723,10 +723,10 @@ binder::Status InstalldNativeService::createAppDataLocked( } } // TODO(b/220095381): Due to boot time regression, we have omitted call to // TODO(b/220095381): Due to boot time regression, we have omitted call to // createAppDirectoryForSupplementalData from here temporarily (unless it's for testing) // createSdkSandboxDataDirectory from here temporarily (unless it's for testing) if (uuid_ != nullptr && strcmp(uuid_, "TEST") == 0) { if (uuid_ != nullptr && strcmp(uuid_, "TEST") == 0) { auto status = createAppDirectoryForSupplementalData(uuid, packageName, userId, appId, auto status = createSdkSandboxDataDirectory(uuid, packageName, userId, appId, previousAppId, previousAppId, seInfo, flags); seInfo, flags); if (!status.isOk()) { if (!status.isOk()) { return status; return status; } } Loading @@ -736,15 +736,15 @@ binder::Status InstalldNativeService::createAppDataLocked( } } /** /** * Responsible for creating /data/user/0/supplemental/<app-name> directory and other * Responsible for creating /data/misc_{ce|de}/user/0/sdksandbox/<app-name> directory and other * app level sub directories, such as ./shared * app level sub directories, such as ./shared */ */ binder::Status InstalldNativeService::createAppDirectoryForSupplementalData( binder::Status InstalldNativeService::createSdkSandboxDataDirectory( const std::optional<std::string>& uuid, const std::string& packageName, int32_t userId, const std::optional<std::string>& uuid, const std::string& packageName, int32_t userId, int32_t appId, int32_t previousAppId, const std::string& seInfo, int32_t flags) { int32_t appId, int32_t previousAppId, const std::string& seInfo, int32_t flags) { int32_t supplementalUid = multiuser_get_supplemental_uid(userId, appId); int32_t sdkSandboxUid = multiuser_get_sdk_sandbox_uid(userId, appId); if (supplementalUid == -1) { if (sdkSandboxUid == -1) { // There no valid supplemental process for this app. Skip creation of data directory // There no valid sdk sandbox process for this app. Skip creation of data directory return ok(); return ok(); } } Loading @@ -759,35 +759,35 @@ binder::Status InstalldNativeService::createAppDirectoryForSupplementalData( } } bool isCeData = (currentFlag == FLAG_STORAGE_CE); bool isCeData = (currentFlag == FLAG_STORAGE_CE); // /data/misc_{ce,de}/<user-id>/supplemental directory gets created by vold // /data/misc_{ce,de}/<user-id>/sdksandbox directory gets created by vold // during user creation // during user creation // Prepare the app directory // Prepare the app directory auto appPath = create_data_misc_supplemental_package_path(uuid_, isCeData, userId, auto appPath = create_data_misc_sdk_sandbox_package_path(uuid_, isCeData, userId, packageName.c_str()); packageName.c_str()); if (prepare_app_dir(appPath, 0751, AID_SYSTEM)) { if (prepare_app_dir(appPath, 0751, AID_SYSTEM)) { return error("Failed to prepare " + appPath); return error("Failed to prepare " + appPath); } } // Now prepare the shared directory which will be accessible by all codes // Now prepare the shared directory which will be accessible by all codes auto sharedPath = create_data_misc_supplemental_shared_path(uuid_, isCeData, userId, auto sharedPath = create_data_misc_sdk_sandbox_shared_path(uuid_, isCeData, userId, packageName.c_str()); packageName.c_str()); int32_t previousSupplementalUid = multiuser_get_supplemental_uid(userId, previousAppId); int32_t previousSdkSandboxUid = multiuser_get_sdk_sandbox_uid(userId, previousAppId); int32_t cacheGid = multiuser_get_cache_gid(userId, appId); int32_t cacheGid = multiuser_get_cache_gid(userId, appId); if (cacheGid == -1) { if (cacheGid == -1) { return exception(binder::Status::EX_ILLEGAL_STATE, return exception(binder::Status::EX_ILLEGAL_STATE, StringPrintf("cacheGid cannot be -1 for supplemental data")); StringPrintf("cacheGid cannot be -1 for sdksandbox data")); } } auto status = createAppDataDirs(sharedPath, supplementalUid, &previousSupplementalUid, auto status = createAppDataDirs(sharedPath, sdkSandboxUid, &previousSdkSandboxUid, cacheGid, cacheGid, seInfo, 0700); seInfo, 0700); if (!status.isOk()) { if (!status.isOk()) { return status; return status; } } // TODO(b/211763739): We also need to handle art profile creations // TODO(b/211763739): We also need to handle art profile creations // TODO(b/211763739): And return the CE inode of the supplemental root directory and // TODO(b/211763739): And return the CE inode of the sdksandbox root directory and // app directory under it so we can clear contents while CE storage is locked // app directory under it so we can clear contents while CE storage is locked } } Loading cmds/installd/InstalldNativeService.h +4 −5 Original line number Original line Diff line number Diff line Loading @@ -205,10 +205,9 @@ private: const std::string& seInfo, int32_t targetSdkVersion, const std::string& seInfo, int32_t targetSdkVersion, int64_t* _aidl_return); int64_t* _aidl_return); binder::Status createAppDirectoryForSupplementalData(const std::optional<std::string>& uuid, binder::Status createSdkSandboxDataDirectory(const std::optional<std::string>& uuid, const std::string& packageName, const std::string& packageName, int32_t userId, int32_t userId, int32_t appId, int32_t appId, int32_t previousAppId, int32_t previousAppId, const std::string& seInfo, int32_t flags); const std::string& seInfo, int32_t flags); }; }; Loading cmds/installd/tests/installd_service_test.cpp +19 −21 Original line number Original line Diff line number Diff line Loading @@ -81,7 +81,7 @@ static constexpr const int32_t kTestUserId = 0; static constexpr const uid_t kTestAppId = 19999; static constexpr const uid_t kTestAppId = 19999; const gid_t kTestAppUid = multiuser_get_uid(kTestUserId, kTestAppId); const gid_t kTestAppUid = multiuser_get_uid(kTestUserId, kTestAppId); const uid_t kTestAppSupplementalUid = multiuser_get_supplemental_uid(kTestUserId, kTestAppId); const uid_t kTestSdkSandboxUid = multiuser_get_sdk_sandbox_uid(kTestUserId, kTestAppId); #define FLAG_FORCE InstalldNativeService::FLAG_FORCE #define FLAG_FORCE InstalldNativeService::FLAG_FORCE Loading Loading @@ -936,7 +936,7 @@ TEST_F(AppDataSnapshotTest, RestoreAppDataSnapshot_WrongVolumeUuid) { "com.foo", 10000, "", 0, 41, FLAG_STORAGE_DE)); "com.foo", 10000, "", 0, 41, FLAG_STORAGE_DE)); } } class AppSupplementalDataTest : public testing::Test { class SdkSandboxDataTest : public testing::Test { public: public: void CheckFileAccess(const std::string& path, uid_t uid, mode_t mode) { void CheckFileAccess(const std::string& path, uid_t uid, mode_t mode) { const auto fullPath = "/data/local/tmp/" + path; const auto fullPath = "/data/local/tmp/" + path; Loading Loading @@ -973,8 +973,8 @@ protected: clearAppData(); clearAppData(); ASSERT_TRUE(mkdirs("/data/local/tmp/user/0", 0700)); ASSERT_TRUE(mkdirs("/data/local/tmp/user/0", 0700)); ASSERT_TRUE(mkdirs("/data/local/tmp/user_de/0", 0700)); ASSERT_TRUE(mkdirs("/data/local/tmp/user_de/0", 0700)); ASSERT_TRUE(mkdirs("/data/local/tmp/misc_ce/0/supplemental", 0700)); ASSERT_TRUE(mkdirs("/data/local/tmp/misc_ce/0/sdksandbox", 0700)); ASSERT_TRUE(mkdirs("/data/local/tmp/misc_de/0/supplemental", 0700)); ASSERT_TRUE(mkdirs("/data/local/tmp/misc_de/0/sdksandbox", 0700)); init_globals_from_data_and_root(); init_globals_from_data_and_root(); } } Loading @@ -993,7 +993,7 @@ private: } } }; }; TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData) { TEST_F(SdkSandboxDataTest, CreateAppData_CreatesSupplementalAppData) { android::os::CreateAppDataResult result; android::os::CreateAppDataResult result; android::os::CreateAppDataArgs args = createAppDataArgs(); android::os::CreateAppDataArgs args = createAppDataArgs(); args.packageName = "com.foo"; args.packageName = "com.foo"; Loading @@ -1002,24 +1002,22 @@ TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData) { // Create the app user data. // Create the app user data. ASSERT_BINDER_SUCCESS(service->createAppData(args, &result)); ASSERT_BINDER_SUCCESS(service->createAppData(args, &result)); CheckFileAccess("misc_ce/0/supplemental/com.foo", kSystemUid, S_IFDIR | 0751); CheckFileAccess("misc_ce/0/sdksandbox/com.foo", kSystemUid, S_IFDIR | 0751); CheckFileAccess("misc_ce/0/supplemental/com.foo/shared", kTestAppSupplementalUid, CheckFileAccess("misc_ce/0/sdksandbox/com.foo/shared", kTestSdkSandboxUid, S_IFDIR | 0700); S_IFDIR | 0700); CheckFileAccess("misc_ce/0/sdksandbox/com.foo/shared/cache", kTestSdkSandboxUid, CheckFileAccess("misc_ce/0/supplemental/com.foo/shared/cache", kTestAppSupplementalUid, S_IFDIR | S_ISGID | 0771); S_IFDIR | S_ISGID | 0771); CheckFileAccess("misc_ce/0/supplemental/com.foo/shared/code_cache", kTestAppSupplementalUid, CheckFileAccess("misc_ce/0/sdksandbox/com.foo/shared/code_cache", kTestSdkSandboxUid, S_IFDIR | S_ISGID | 0771); S_IFDIR | S_ISGID | 0771); CheckFileAccess("misc_de/0/supplemental/com.foo", kSystemUid, S_IFDIR | 0751); CheckFileAccess("misc_de/0/sdksandbox/com.foo", kSystemUid, S_IFDIR | 0751); CheckFileAccess("misc_de/0/supplemental/com.foo/shared", kTestAppSupplementalUid, CheckFileAccess("misc_de/0/sdksandbox/com.foo/shared", kTestSdkSandboxUid, S_IFDIR | 0700); S_IFDIR | 0700); CheckFileAccess("misc_de/0/sdksandbox/com.foo/shared/cache", kTestSdkSandboxUid, CheckFileAccess("misc_de/0/supplemental/com.foo/shared/cache", kTestAppSupplementalUid, S_IFDIR | S_ISGID | 0771); S_IFDIR | S_ISGID | 0771); CheckFileAccess("misc_de/0/supplemental/com.foo/shared/code_cache", kTestAppSupplementalUid, CheckFileAccess("misc_de/0/sdksandbox/com.foo/shared/code_cache", kTestSdkSandboxUid, S_IFDIR | S_ISGID | 0771); S_IFDIR | S_ISGID | 0771); } } TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData_WithoutDeFlag) { TEST_F(SdkSandboxDataTest, CreateAppData_CreatesSupplementalAppData_WithoutDeFlag) { android::os::CreateAppDataResult result; android::os::CreateAppDataResult result; android::os::CreateAppDataArgs args = createAppDataArgs(); android::os::CreateAppDataArgs args = createAppDataArgs(); args.packageName = "com.foo"; args.packageName = "com.foo"; Loading @@ -1029,13 +1027,13 @@ TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData_Without ASSERT_BINDER_SUCCESS(service->createAppData(args, &result)); ASSERT_BINDER_SUCCESS(service->createAppData(args, &result)); // Only CE paths should exist // Only CE paths should exist CheckFileAccess("misc_ce/0/supplemental/com.foo", kSystemUid, S_IFDIR | 0751); CheckFileAccess("misc_ce/0/sdksandbox/com.foo", kSystemUid, S_IFDIR | 0751); // DE paths should not exist // DE paths should not exist ASSERT_FALSE(exists("/data/local/tmp/misc_de/0/supplemental/com.foo")); ASSERT_FALSE(exists("/data/local/tmp/misc_de/0/sdksandbox/com.foo")); } } TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData_WithoutCeFlag) { TEST_F(SdkSandboxDataTest, CreateAppData_CreatesSupplementalAppData_WithoutCeFlag) { android::os::CreateAppDataResult result; android::os::CreateAppDataResult result; android::os::CreateAppDataArgs args = createAppDataArgs(); android::os::CreateAppDataArgs args = createAppDataArgs(); args.packageName = "com.foo"; args.packageName = "com.foo"; Loading @@ -1045,10 +1043,10 @@ TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData_Without ASSERT_BINDER_SUCCESS(service->createAppData(args, &result)); ASSERT_BINDER_SUCCESS(service->createAppData(args, &result)); // CE paths should not exist // CE paths should not exist ASSERT_FALSE(exists("/data/local/tmp/misc_ce/0/supplemental/com.foo")); ASSERT_FALSE(exists("/data/local/tmp/misc_ce/0/sdksandbox/com.foo")); // Only DE paths should exist // Only DE paths should exist CheckFileAccess("misc_de/0/supplemental/com.foo", kSystemUid, S_IFDIR | 0751); CheckFileAccess("misc_de/0/sdksandbox/com.foo", kSystemUid, S_IFDIR | 0751); } } } // namespace installd } // namespace installd Loading cmds/installd/tests/installd_utils_test.cpp +25 −27 Original line number Original line Diff line number Diff line Loading @@ -656,38 +656,36 @@ TEST_F(UtilsTest, TestCreateDirIfNeeded) { ASSERT_NE(0, create_dir_if_needed("/data/local/tmp/user/0/bar/baz", 0700)); ASSERT_NE(0, create_dir_if_needed("/data/local/tmp/user/0/bar/baz", 0700)); } } TEST_F(UtilsTest, TestSupplementalDataPaths) { TEST_F(UtilsTest, TestSdkSandboxDataPaths) { // Ce data paths // Ce data paths EXPECT_EQ("/data/misc_ce/0/supplemental", EXPECT_EQ("/data/misc_ce/0/sdksandbox", create_data_misc_supplemental_path(nullptr, /*isCeData=*/true, 0)); create_data_misc_sdk_sandbox_path(nullptr, /*isCeData=*/true, 0)); EXPECT_EQ("/data/misc_ce/10/supplemental", EXPECT_EQ("/data/misc_ce/10/sdksandbox", create_data_misc_sdk_sandbox_path(nullptr, true, 10)); create_data_misc_supplemental_path(nullptr, true, 10)); EXPECT_EQ("/data/misc_ce/0/supplemental/com.foo", EXPECT_EQ("/data/misc_ce/0/sdksandbox/com.foo", create_data_misc_supplemental_package_path(nullptr, true, 0, "com.foo")); create_data_misc_sdk_sandbox_package_path(nullptr, true, 0, "com.foo")); EXPECT_EQ("/data/misc_ce/10/supplemental/com.foo", EXPECT_EQ("/data/misc_ce/10/sdksandbox/com.foo", create_data_misc_supplemental_package_path(nullptr, true, 10, "com.foo")); create_data_misc_sdk_sandbox_package_path(nullptr, true, 10, "com.foo")); EXPECT_EQ("/data/misc_ce/0/supplemental/com.foo/shared", EXPECT_EQ("/data/misc_ce/0/sdksandbox/com.foo/shared", create_data_misc_supplemental_shared_path(nullptr, true, 0, "com.foo")); create_data_misc_sdk_sandbox_shared_path(nullptr, true, 0, "com.foo")); EXPECT_EQ("/data/misc_ce/10/supplemental/com.foo/shared", EXPECT_EQ("/data/misc_ce/10/sdksandbox/com.foo/shared", create_data_misc_supplemental_shared_path(nullptr, true, 10, "com.foo")); create_data_misc_sdk_sandbox_shared_path(nullptr, true, 10, "com.foo")); // De data paths // De data paths EXPECT_EQ("/data/misc_de/0/supplemental", EXPECT_EQ("/data/misc_de/0/sdksandbox", create_data_misc_supplemental_path(nullptr, /*isCeData=*/false, 0)); create_data_misc_sdk_sandbox_path(nullptr, /*isCeData=*/false, 0)); EXPECT_EQ("/data/misc_de/10/supplemental", EXPECT_EQ("/data/misc_de/10/sdksandbox", create_data_misc_sdk_sandbox_path(nullptr, false, 10)); create_data_misc_supplemental_path(nullptr, false, 10)); EXPECT_EQ("/data/misc_de/0/sdksandbox/com.foo", EXPECT_EQ("/data/misc_de/0/supplemental/com.foo", create_data_misc_sdk_sandbox_package_path(nullptr, false, 0, "com.foo")); create_data_misc_supplemental_package_path(nullptr, false, 0, "com.foo")); EXPECT_EQ("/data/misc_de/10/sdksandbox/com.foo", EXPECT_EQ("/data/misc_de/10/supplemental/com.foo", create_data_misc_sdk_sandbox_package_path(nullptr, false, 10, "com.foo")); create_data_misc_supplemental_package_path(nullptr, false, 10, "com.foo")); EXPECT_EQ("/data/misc_de/0/sdksandbox/com.foo/shared", EXPECT_EQ("/data/misc_de/0/supplemental/com.foo/shared", create_data_misc_sdk_sandbox_shared_path(nullptr, false, 0, "com.foo")); create_data_misc_supplemental_shared_path(nullptr, false, 0, "com.foo")); EXPECT_EQ("/data/misc_de/10/sdksandbox/com.foo/shared", EXPECT_EQ("/data/misc_de/10/supplemental/com.foo/shared", create_data_misc_sdk_sandbox_shared_path(nullptr, false, 10, "com.foo")); create_data_misc_supplemental_shared_path(nullptr, false, 10, "com.foo")); } } } // namespace installd } // namespace installd Loading cmds/installd/utils.cpp +14 −14 Original line number Original line Diff line number Diff line Loading @@ -195,38 +195,38 @@ std::string create_data_user_de_path(const char* volume_uuid, userid_t userid) { } } /** /** * Create the path name where supplemental data for all apps will be stored. * Create the path name where sdk_sandbox data for all apps will be stored. * E.g. /data/misc_ce/0/supplemental * E.g. /data/misc_ce/0/sdksandbox */ */ std::string create_data_misc_supplemental_path(const char* uuid, bool isCeData, userid_t user) { std::string create_data_misc_sdk_sandbox_path(const char* uuid, bool isCeData, userid_t user) { std::string data(create_data_path(uuid)); std::string data(create_data_path(uuid)); if (isCeData) { if (isCeData) { return StringPrintf("%s/misc_ce/%d/supplemental", data.c_str(), user); return StringPrintf("%s/misc_ce/%d/sdksandbox", data.c_str(), user); } else { } else { return StringPrintf("%s/misc_de/%d/supplemental", data.c_str(), user); return StringPrintf("%s/misc_de/%d/sdksandbox", data.c_str(), user); } } } } /** /** * Create the path name where code data for all codes in a particular app will be stored. * Create the path name where code data for all codes in a particular app will be stored. * E.g. /data/misc_ce/0/supplemental/<app-name> * E.g. /data/misc_ce/0/sdksandbox/<app-name> */ */ std::string create_data_misc_supplemental_package_path(const char* volume_uuid, bool isCeData, std::string create_data_misc_sdk_sandbox_package_path(const char* volume_uuid, bool isCeData, userid_t user, const char* package_name) { userid_t user, const char* package_name) { check_package_name(package_name); check_package_name(package_name); return StringPrintf("%s/%s", return StringPrintf("%s/%s", create_data_misc_supplemental_path(volume_uuid, isCeData, user).c_str(), create_data_misc_sdk_sandbox_path(volume_uuid, isCeData, user).c_str(), package_name); package_name); } } /** /** * Create the path name where shared code data for a particular app will be stored. * Create the path name where shared code data for a particular app will be stored. * E.g. /data/misc_ce/0/supplemental/<app-name>/shared * E.g. /data/misc_ce/0/sdksandbox/<app-name>/shared */ */ std::string create_data_misc_supplemental_shared_path(const char* volume_uuid, bool isCeData, std::string create_data_misc_sdk_sandbox_shared_path(const char* volume_uuid, bool isCeData, userid_t user, const char* package_name) { userid_t user, const char* package_name) { return StringPrintf("%s/shared", return StringPrintf("%s/shared", create_data_misc_supplemental_package_path(volume_uuid, isCeData, user, create_data_misc_sdk_sandbox_package_path(volume_uuid, isCeData, user, package_name) package_name) .c_str()); .c_str()); } } Loading Loading
cmds/installd/InstalldNativeService.cpp +18 −18 Original line number Original line Diff line number Diff line Loading @@ -723,10 +723,10 @@ binder::Status InstalldNativeService::createAppDataLocked( } } // TODO(b/220095381): Due to boot time regression, we have omitted call to // TODO(b/220095381): Due to boot time regression, we have omitted call to // createAppDirectoryForSupplementalData from here temporarily (unless it's for testing) // createSdkSandboxDataDirectory from here temporarily (unless it's for testing) if (uuid_ != nullptr && strcmp(uuid_, "TEST") == 0) { if (uuid_ != nullptr && strcmp(uuid_, "TEST") == 0) { auto status = createAppDirectoryForSupplementalData(uuid, packageName, userId, appId, auto status = createSdkSandboxDataDirectory(uuid, packageName, userId, appId, previousAppId, previousAppId, seInfo, flags); seInfo, flags); if (!status.isOk()) { if (!status.isOk()) { return status; return status; } } Loading @@ -736,15 +736,15 @@ binder::Status InstalldNativeService::createAppDataLocked( } } /** /** * Responsible for creating /data/user/0/supplemental/<app-name> directory and other * Responsible for creating /data/misc_{ce|de}/user/0/sdksandbox/<app-name> directory and other * app level sub directories, such as ./shared * app level sub directories, such as ./shared */ */ binder::Status InstalldNativeService::createAppDirectoryForSupplementalData( binder::Status InstalldNativeService::createSdkSandboxDataDirectory( const std::optional<std::string>& uuid, const std::string& packageName, int32_t userId, const std::optional<std::string>& uuid, const std::string& packageName, int32_t userId, int32_t appId, int32_t previousAppId, const std::string& seInfo, int32_t flags) { int32_t appId, int32_t previousAppId, const std::string& seInfo, int32_t flags) { int32_t supplementalUid = multiuser_get_supplemental_uid(userId, appId); int32_t sdkSandboxUid = multiuser_get_sdk_sandbox_uid(userId, appId); if (supplementalUid == -1) { if (sdkSandboxUid == -1) { // There no valid supplemental process for this app. Skip creation of data directory // There no valid sdk sandbox process for this app. Skip creation of data directory return ok(); return ok(); } } Loading @@ -759,35 +759,35 @@ binder::Status InstalldNativeService::createAppDirectoryForSupplementalData( } } bool isCeData = (currentFlag == FLAG_STORAGE_CE); bool isCeData = (currentFlag == FLAG_STORAGE_CE); // /data/misc_{ce,de}/<user-id>/supplemental directory gets created by vold // /data/misc_{ce,de}/<user-id>/sdksandbox directory gets created by vold // during user creation // during user creation // Prepare the app directory // Prepare the app directory auto appPath = create_data_misc_supplemental_package_path(uuid_, isCeData, userId, auto appPath = create_data_misc_sdk_sandbox_package_path(uuid_, isCeData, userId, packageName.c_str()); packageName.c_str()); if (prepare_app_dir(appPath, 0751, AID_SYSTEM)) { if (prepare_app_dir(appPath, 0751, AID_SYSTEM)) { return error("Failed to prepare " + appPath); return error("Failed to prepare " + appPath); } } // Now prepare the shared directory which will be accessible by all codes // Now prepare the shared directory which will be accessible by all codes auto sharedPath = create_data_misc_supplemental_shared_path(uuid_, isCeData, userId, auto sharedPath = create_data_misc_sdk_sandbox_shared_path(uuid_, isCeData, userId, packageName.c_str()); packageName.c_str()); int32_t previousSupplementalUid = multiuser_get_supplemental_uid(userId, previousAppId); int32_t previousSdkSandboxUid = multiuser_get_sdk_sandbox_uid(userId, previousAppId); int32_t cacheGid = multiuser_get_cache_gid(userId, appId); int32_t cacheGid = multiuser_get_cache_gid(userId, appId); if (cacheGid == -1) { if (cacheGid == -1) { return exception(binder::Status::EX_ILLEGAL_STATE, return exception(binder::Status::EX_ILLEGAL_STATE, StringPrintf("cacheGid cannot be -1 for supplemental data")); StringPrintf("cacheGid cannot be -1 for sdksandbox data")); } } auto status = createAppDataDirs(sharedPath, supplementalUid, &previousSupplementalUid, auto status = createAppDataDirs(sharedPath, sdkSandboxUid, &previousSdkSandboxUid, cacheGid, cacheGid, seInfo, 0700); seInfo, 0700); if (!status.isOk()) { if (!status.isOk()) { return status; return status; } } // TODO(b/211763739): We also need to handle art profile creations // TODO(b/211763739): We also need to handle art profile creations // TODO(b/211763739): And return the CE inode of the supplemental root directory and // TODO(b/211763739): And return the CE inode of the sdksandbox root directory and // app directory under it so we can clear contents while CE storage is locked // app directory under it so we can clear contents while CE storage is locked } } Loading
cmds/installd/InstalldNativeService.h +4 −5 Original line number Original line Diff line number Diff line Loading @@ -205,10 +205,9 @@ private: const std::string& seInfo, int32_t targetSdkVersion, const std::string& seInfo, int32_t targetSdkVersion, int64_t* _aidl_return); int64_t* _aidl_return); binder::Status createAppDirectoryForSupplementalData(const std::optional<std::string>& uuid, binder::Status createSdkSandboxDataDirectory(const std::optional<std::string>& uuid, const std::string& packageName, const std::string& packageName, int32_t userId, int32_t userId, int32_t appId, int32_t appId, int32_t previousAppId, int32_t previousAppId, const std::string& seInfo, int32_t flags); const std::string& seInfo, int32_t flags); }; }; Loading
cmds/installd/tests/installd_service_test.cpp +19 −21 Original line number Original line Diff line number Diff line Loading @@ -81,7 +81,7 @@ static constexpr const int32_t kTestUserId = 0; static constexpr const uid_t kTestAppId = 19999; static constexpr const uid_t kTestAppId = 19999; const gid_t kTestAppUid = multiuser_get_uid(kTestUserId, kTestAppId); const gid_t kTestAppUid = multiuser_get_uid(kTestUserId, kTestAppId); const uid_t kTestAppSupplementalUid = multiuser_get_supplemental_uid(kTestUserId, kTestAppId); const uid_t kTestSdkSandboxUid = multiuser_get_sdk_sandbox_uid(kTestUserId, kTestAppId); #define FLAG_FORCE InstalldNativeService::FLAG_FORCE #define FLAG_FORCE InstalldNativeService::FLAG_FORCE Loading Loading @@ -936,7 +936,7 @@ TEST_F(AppDataSnapshotTest, RestoreAppDataSnapshot_WrongVolumeUuid) { "com.foo", 10000, "", 0, 41, FLAG_STORAGE_DE)); "com.foo", 10000, "", 0, 41, FLAG_STORAGE_DE)); } } class AppSupplementalDataTest : public testing::Test { class SdkSandboxDataTest : public testing::Test { public: public: void CheckFileAccess(const std::string& path, uid_t uid, mode_t mode) { void CheckFileAccess(const std::string& path, uid_t uid, mode_t mode) { const auto fullPath = "/data/local/tmp/" + path; const auto fullPath = "/data/local/tmp/" + path; Loading Loading @@ -973,8 +973,8 @@ protected: clearAppData(); clearAppData(); ASSERT_TRUE(mkdirs("/data/local/tmp/user/0", 0700)); ASSERT_TRUE(mkdirs("/data/local/tmp/user/0", 0700)); ASSERT_TRUE(mkdirs("/data/local/tmp/user_de/0", 0700)); ASSERT_TRUE(mkdirs("/data/local/tmp/user_de/0", 0700)); ASSERT_TRUE(mkdirs("/data/local/tmp/misc_ce/0/supplemental", 0700)); ASSERT_TRUE(mkdirs("/data/local/tmp/misc_ce/0/sdksandbox", 0700)); ASSERT_TRUE(mkdirs("/data/local/tmp/misc_de/0/supplemental", 0700)); ASSERT_TRUE(mkdirs("/data/local/tmp/misc_de/0/sdksandbox", 0700)); init_globals_from_data_and_root(); init_globals_from_data_and_root(); } } Loading @@ -993,7 +993,7 @@ private: } } }; }; TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData) { TEST_F(SdkSandboxDataTest, CreateAppData_CreatesSupplementalAppData) { android::os::CreateAppDataResult result; android::os::CreateAppDataResult result; android::os::CreateAppDataArgs args = createAppDataArgs(); android::os::CreateAppDataArgs args = createAppDataArgs(); args.packageName = "com.foo"; args.packageName = "com.foo"; Loading @@ -1002,24 +1002,22 @@ TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData) { // Create the app user data. // Create the app user data. ASSERT_BINDER_SUCCESS(service->createAppData(args, &result)); ASSERT_BINDER_SUCCESS(service->createAppData(args, &result)); CheckFileAccess("misc_ce/0/supplemental/com.foo", kSystemUid, S_IFDIR | 0751); CheckFileAccess("misc_ce/0/sdksandbox/com.foo", kSystemUid, S_IFDIR | 0751); CheckFileAccess("misc_ce/0/supplemental/com.foo/shared", kTestAppSupplementalUid, CheckFileAccess("misc_ce/0/sdksandbox/com.foo/shared", kTestSdkSandboxUid, S_IFDIR | 0700); S_IFDIR | 0700); CheckFileAccess("misc_ce/0/sdksandbox/com.foo/shared/cache", kTestSdkSandboxUid, CheckFileAccess("misc_ce/0/supplemental/com.foo/shared/cache", kTestAppSupplementalUid, S_IFDIR | S_ISGID | 0771); S_IFDIR | S_ISGID | 0771); CheckFileAccess("misc_ce/0/supplemental/com.foo/shared/code_cache", kTestAppSupplementalUid, CheckFileAccess("misc_ce/0/sdksandbox/com.foo/shared/code_cache", kTestSdkSandboxUid, S_IFDIR | S_ISGID | 0771); S_IFDIR | S_ISGID | 0771); CheckFileAccess("misc_de/0/supplemental/com.foo", kSystemUid, S_IFDIR | 0751); CheckFileAccess("misc_de/0/sdksandbox/com.foo", kSystemUid, S_IFDIR | 0751); CheckFileAccess("misc_de/0/supplemental/com.foo/shared", kTestAppSupplementalUid, CheckFileAccess("misc_de/0/sdksandbox/com.foo/shared", kTestSdkSandboxUid, S_IFDIR | 0700); S_IFDIR | 0700); CheckFileAccess("misc_de/0/sdksandbox/com.foo/shared/cache", kTestSdkSandboxUid, CheckFileAccess("misc_de/0/supplemental/com.foo/shared/cache", kTestAppSupplementalUid, S_IFDIR | S_ISGID | 0771); S_IFDIR | S_ISGID | 0771); CheckFileAccess("misc_de/0/supplemental/com.foo/shared/code_cache", kTestAppSupplementalUid, CheckFileAccess("misc_de/0/sdksandbox/com.foo/shared/code_cache", kTestSdkSandboxUid, S_IFDIR | S_ISGID | 0771); S_IFDIR | S_ISGID | 0771); } } TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData_WithoutDeFlag) { TEST_F(SdkSandboxDataTest, CreateAppData_CreatesSupplementalAppData_WithoutDeFlag) { android::os::CreateAppDataResult result; android::os::CreateAppDataResult result; android::os::CreateAppDataArgs args = createAppDataArgs(); android::os::CreateAppDataArgs args = createAppDataArgs(); args.packageName = "com.foo"; args.packageName = "com.foo"; Loading @@ -1029,13 +1027,13 @@ TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData_Without ASSERT_BINDER_SUCCESS(service->createAppData(args, &result)); ASSERT_BINDER_SUCCESS(service->createAppData(args, &result)); // Only CE paths should exist // Only CE paths should exist CheckFileAccess("misc_ce/0/supplemental/com.foo", kSystemUid, S_IFDIR | 0751); CheckFileAccess("misc_ce/0/sdksandbox/com.foo", kSystemUid, S_IFDIR | 0751); // DE paths should not exist // DE paths should not exist ASSERT_FALSE(exists("/data/local/tmp/misc_de/0/supplemental/com.foo")); ASSERT_FALSE(exists("/data/local/tmp/misc_de/0/sdksandbox/com.foo")); } } TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData_WithoutCeFlag) { TEST_F(SdkSandboxDataTest, CreateAppData_CreatesSupplementalAppData_WithoutCeFlag) { android::os::CreateAppDataResult result; android::os::CreateAppDataResult result; android::os::CreateAppDataArgs args = createAppDataArgs(); android::os::CreateAppDataArgs args = createAppDataArgs(); args.packageName = "com.foo"; args.packageName = "com.foo"; Loading @@ -1045,10 +1043,10 @@ TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData_Without ASSERT_BINDER_SUCCESS(service->createAppData(args, &result)); ASSERT_BINDER_SUCCESS(service->createAppData(args, &result)); // CE paths should not exist // CE paths should not exist ASSERT_FALSE(exists("/data/local/tmp/misc_ce/0/supplemental/com.foo")); ASSERT_FALSE(exists("/data/local/tmp/misc_ce/0/sdksandbox/com.foo")); // Only DE paths should exist // Only DE paths should exist CheckFileAccess("misc_de/0/supplemental/com.foo", kSystemUid, S_IFDIR | 0751); CheckFileAccess("misc_de/0/sdksandbox/com.foo", kSystemUid, S_IFDIR | 0751); } } } // namespace installd } // namespace installd Loading
cmds/installd/tests/installd_utils_test.cpp +25 −27 Original line number Original line Diff line number Diff line Loading @@ -656,38 +656,36 @@ TEST_F(UtilsTest, TestCreateDirIfNeeded) { ASSERT_NE(0, create_dir_if_needed("/data/local/tmp/user/0/bar/baz", 0700)); ASSERT_NE(0, create_dir_if_needed("/data/local/tmp/user/0/bar/baz", 0700)); } } TEST_F(UtilsTest, TestSupplementalDataPaths) { TEST_F(UtilsTest, TestSdkSandboxDataPaths) { // Ce data paths // Ce data paths EXPECT_EQ("/data/misc_ce/0/supplemental", EXPECT_EQ("/data/misc_ce/0/sdksandbox", create_data_misc_supplemental_path(nullptr, /*isCeData=*/true, 0)); create_data_misc_sdk_sandbox_path(nullptr, /*isCeData=*/true, 0)); EXPECT_EQ("/data/misc_ce/10/supplemental", EXPECT_EQ("/data/misc_ce/10/sdksandbox", create_data_misc_sdk_sandbox_path(nullptr, true, 10)); create_data_misc_supplemental_path(nullptr, true, 10)); EXPECT_EQ("/data/misc_ce/0/supplemental/com.foo", EXPECT_EQ("/data/misc_ce/0/sdksandbox/com.foo", create_data_misc_supplemental_package_path(nullptr, true, 0, "com.foo")); create_data_misc_sdk_sandbox_package_path(nullptr, true, 0, "com.foo")); EXPECT_EQ("/data/misc_ce/10/supplemental/com.foo", EXPECT_EQ("/data/misc_ce/10/sdksandbox/com.foo", create_data_misc_supplemental_package_path(nullptr, true, 10, "com.foo")); create_data_misc_sdk_sandbox_package_path(nullptr, true, 10, "com.foo")); EXPECT_EQ("/data/misc_ce/0/supplemental/com.foo/shared", EXPECT_EQ("/data/misc_ce/0/sdksandbox/com.foo/shared", create_data_misc_supplemental_shared_path(nullptr, true, 0, "com.foo")); create_data_misc_sdk_sandbox_shared_path(nullptr, true, 0, "com.foo")); EXPECT_EQ("/data/misc_ce/10/supplemental/com.foo/shared", EXPECT_EQ("/data/misc_ce/10/sdksandbox/com.foo/shared", create_data_misc_supplemental_shared_path(nullptr, true, 10, "com.foo")); create_data_misc_sdk_sandbox_shared_path(nullptr, true, 10, "com.foo")); // De data paths // De data paths EXPECT_EQ("/data/misc_de/0/supplemental", EXPECT_EQ("/data/misc_de/0/sdksandbox", create_data_misc_supplemental_path(nullptr, /*isCeData=*/false, 0)); create_data_misc_sdk_sandbox_path(nullptr, /*isCeData=*/false, 0)); EXPECT_EQ("/data/misc_de/10/supplemental", EXPECT_EQ("/data/misc_de/10/sdksandbox", create_data_misc_sdk_sandbox_path(nullptr, false, 10)); create_data_misc_supplemental_path(nullptr, false, 10)); EXPECT_EQ("/data/misc_de/0/sdksandbox/com.foo", EXPECT_EQ("/data/misc_de/0/supplemental/com.foo", create_data_misc_sdk_sandbox_package_path(nullptr, false, 0, "com.foo")); create_data_misc_supplemental_package_path(nullptr, false, 0, "com.foo")); EXPECT_EQ("/data/misc_de/10/sdksandbox/com.foo", EXPECT_EQ("/data/misc_de/10/supplemental/com.foo", create_data_misc_sdk_sandbox_package_path(nullptr, false, 10, "com.foo")); create_data_misc_supplemental_package_path(nullptr, false, 10, "com.foo")); EXPECT_EQ("/data/misc_de/0/sdksandbox/com.foo/shared", EXPECT_EQ("/data/misc_de/0/supplemental/com.foo/shared", create_data_misc_sdk_sandbox_shared_path(nullptr, false, 0, "com.foo")); create_data_misc_supplemental_shared_path(nullptr, false, 0, "com.foo")); EXPECT_EQ("/data/misc_de/10/sdksandbox/com.foo/shared", EXPECT_EQ("/data/misc_de/10/supplemental/com.foo/shared", create_data_misc_sdk_sandbox_shared_path(nullptr, false, 10, "com.foo")); create_data_misc_supplemental_shared_path(nullptr, false, 10, "com.foo")); } } } // namespace installd } // namespace installd Loading
cmds/installd/utils.cpp +14 −14 Original line number Original line Diff line number Diff line Loading @@ -195,38 +195,38 @@ std::string create_data_user_de_path(const char* volume_uuid, userid_t userid) { } } /** /** * Create the path name where supplemental data for all apps will be stored. * Create the path name where sdk_sandbox data for all apps will be stored. * E.g. /data/misc_ce/0/supplemental * E.g. /data/misc_ce/0/sdksandbox */ */ std::string create_data_misc_supplemental_path(const char* uuid, bool isCeData, userid_t user) { std::string create_data_misc_sdk_sandbox_path(const char* uuid, bool isCeData, userid_t user) { std::string data(create_data_path(uuid)); std::string data(create_data_path(uuid)); if (isCeData) { if (isCeData) { return StringPrintf("%s/misc_ce/%d/supplemental", data.c_str(), user); return StringPrintf("%s/misc_ce/%d/sdksandbox", data.c_str(), user); } else { } else { return StringPrintf("%s/misc_de/%d/supplemental", data.c_str(), user); return StringPrintf("%s/misc_de/%d/sdksandbox", data.c_str(), user); } } } } /** /** * Create the path name where code data for all codes in a particular app will be stored. * Create the path name where code data for all codes in a particular app will be stored. * E.g. /data/misc_ce/0/supplemental/<app-name> * E.g. /data/misc_ce/0/sdksandbox/<app-name> */ */ std::string create_data_misc_supplemental_package_path(const char* volume_uuid, bool isCeData, std::string create_data_misc_sdk_sandbox_package_path(const char* volume_uuid, bool isCeData, userid_t user, const char* package_name) { userid_t user, const char* package_name) { check_package_name(package_name); check_package_name(package_name); return StringPrintf("%s/%s", return StringPrintf("%s/%s", create_data_misc_supplemental_path(volume_uuid, isCeData, user).c_str(), create_data_misc_sdk_sandbox_path(volume_uuid, isCeData, user).c_str(), package_name); package_name); } } /** /** * Create the path name where shared code data for a particular app will be stored. * Create the path name where shared code data for a particular app will be stored. * E.g. /data/misc_ce/0/supplemental/<app-name>/shared * E.g. /data/misc_ce/0/sdksandbox/<app-name>/shared */ */ std::string create_data_misc_supplemental_shared_path(const char* volume_uuid, bool isCeData, std::string create_data_misc_sdk_sandbox_shared_path(const char* volume_uuid, bool isCeData, userid_t user, const char* package_name) { userid_t user, const char* package_name) { return StringPrintf("%s/shared", return StringPrintf("%s/shared", create_data_misc_supplemental_package_path(volume_uuid, isCeData, user, create_data_misc_sdk_sandbox_package_path(volume_uuid, isCeData, user, package_name) package_name) .c_str()); .c_str()); } } Loading