Loading cmds/installd/InstalldNativeService.cpp +22 −18 Original line number 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 // 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) { auto status = createAppDirectoryForSupplementalData(uuid, packageName, userId, appId, previousAppId, seInfo, flags); auto status = createSdkSandboxDataDirectory(uuid, packageName, userId, appId, previousAppId, seInfo, flags); if (!status.isOk()) { 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 */ binder::Status InstalldNativeService::createAppDirectoryForSupplementalData( binder::Status InstalldNativeService::createSdkSandboxDataDirectory( 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 supplementalUid = multiuser_get_supplemental_uid(userId, appId); if (supplementalUid == -1) { // There no valid supplemental process for this app. Skip creation of data directory int32_t sdkSandboxUid = multiuser_get_sdk_sandbox_uid(userId, appId); if (sdkSandboxUid == -1) { // There no valid sdk sandbox process for this app. Skip creation of data directory return ok(); } Loading @@ -759,35 +759,35 @@ binder::Status InstalldNativeService::createAppDirectoryForSupplementalData( } 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 // 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()); if (prepare_app_dir(appPath, 0751, AID_SYSTEM)) { return error("Failed to prepare " + appPath); } // 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()); 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); if (cacheGid == -1) { 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, cacheGid, seInfo, 0700); auto status = createAppDataDirs(sharedPath, sdkSandboxUid, &previousSdkSandboxUid, cacheGid, seInfo, 0700); if (!status.isOk()) { return status; } // 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 } Loading Loading @@ -2084,6 +2084,10 @@ binder::Status InstalldNativeService::getAppSize(const std::optional<std::string const std::vector<std::string>& codePaths, std::vector<int64_t>* _aidl_return) { ENFORCE_UID(AID_SYSTEM); CHECK_ARGUMENT_UUID(uuid); if (packageNames.size() != ceDataInodes.size()) { return exception(binder::Status::EX_ILLEGAL_ARGUMENT, "packageNames/ceDataInodes size mismatch."); } for (const auto& packageName : packageNames) { CHECK_ARGUMENT_PACKAGE_NAME(packageName); } Loading cmds/installd/InstalldNativeService.h +4 −5 Original line number Diff line number Diff line Loading @@ -205,10 +205,9 @@ private: const std::string& seInfo, int32_t targetSdkVersion, int64_t* _aidl_return); binder::Status createAppDirectoryForSupplementalData(const std::optional<std::string>& uuid, const std::string& packageName, int32_t userId, int32_t appId, int32_t previousAppId, binder::Status createSdkSandboxDataDirectory(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); }; Loading cmds/installd/tests/installd_service_test.cpp +32 −21 Original line number Diff line number Diff line Loading @@ -81,7 +81,7 @@ static constexpr const int32_t kTestUserId = 0; static constexpr const uid_t kTestAppId = 19999; 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 Loading Loading @@ -491,6 +491,19 @@ TEST_F(ServiceTest, GetAppSize) { system(removeCommand.c_str()); } } TEST_F(ServiceTest, GetAppSizeWrongSizes) { int32_t externalStorageAppId = -1; std::vector<int64_t> externalStorageSize; std::vector<std::string> codePaths; std::vector<std::string> packageNames = {"package1", "package2"}; std::vector<int64_t> ceDataInodes = {0}; EXPECT_BINDER_FAIL(service->getAppSize(std::nullopt, packageNames, 0, InstalldNativeService::FLAG_USE_QUOTA, externalStorageAppId, ceDataInodes, codePaths, &externalStorageSize)); } static bool mkdirs(const std::string& path, mode_t mode) { struct stat sb; if (stat(path.c_str(), &sb) != -1 && S_ISDIR(sb.st_mode)) { Loading Loading @@ -936,7 +949,7 @@ TEST_F(AppDataSnapshotTest, RestoreAppDataSnapshot_WrongVolumeUuid) { "com.foo", 10000, "", 0, 41, FLAG_STORAGE_DE)); } class AppSupplementalDataTest : public testing::Test { class SdkSandboxDataTest : public testing::Test { public: void CheckFileAccess(const std::string& path, uid_t uid, mode_t mode) { const auto fullPath = "/data/local/tmp/" + path; Loading Loading @@ -973,8 +986,8 @@ protected: clearAppData(); 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/misc_ce/0/supplemental", 0700)); ASSERT_TRUE(mkdirs("/data/local/tmp/misc_de/0/supplemental", 0700)); ASSERT_TRUE(mkdirs("/data/local/tmp/misc_ce/0/sdksandbox", 0700)); ASSERT_TRUE(mkdirs("/data/local/tmp/misc_de/0/sdksandbox", 0700)); init_globals_from_data_and_root(); } Loading @@ -993,7 +1006,7 @@ private: } }; TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData) { TEST_F(SdkSandboxDataTest, CreateAppData_CreatesSupplementalAppData) { android::os::CreateAppDataResult result; android::os::CreateAppDataArgs args = createAppDataArgs(); args.packageName = "com.foo"; Loading @@ -1002,24 +1015,22 @@ TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData) { // Create the app user data. ASSERT_BINDER_SUCCESS(service->createAppData(args, &result)); CheckFileAccess("misc_ce/0/supplemental/com.foo", kSystemUid, S_IFDIR | 0751); CheckFileAccess("misc_ce/0/supplemental/com.foo/shared", kTestAppSupplementalUid, S_IFDIR | 0700); CheckFileAccess("misc_ce/0/supplemental/com.foo/shared/cache", kTestAppSupplementalUid, CheckFileAccess("misc_ce/0/sdksandbox/com.foo", kSystemUid, S_IFDIR | 0751); CheckFileAccess("misc_ce/0/sdksandbox/com.foo/shared", kTestSdkSandboxUid, S_IFDIR | 0700); CheckFileAccess("misc_ce/0/sdksandbox/com.foo/shared/cache", kTestSdkSandboxUid, 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); CheckFileAccess("misc_de/0/supplemental/com.foo", kSystemUid, S_IFDIR | 0751); CheckFileAccess("misc_de/0/supplemental/com.foo/shared", kTestAppSupplementalUid, S_IFDIR | 0700); CheckFileAccess("misc_de/0/supplemental/com.foo/shared/cache", kTestAppSupplementalUid, CheckFileAccess("misc_de/0/sdksandbox/com.foo", kSystemUid, S_IFDIR | 0751); CheckFileAccess("misc_de/0/sdksandbox/com.foo/shared", kTestSdkSandboxUid, S_IFDIR | 0700); CheckFileAccess("misc_de/0/sdksandbox/com.foo/shared/cache", kTestSdkSandboxUid, 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); } TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData_WithoutDeFlag) { TEST_F(SdkSandboxDataTest, CreateAppData_CreatesSupplementalAppData_WithoutDeFlag) { android::os::CreateAppDataResult result; android::os::CreateAppDataArgs args = createAppDataArgs(); args.packageName = "com.foo"; Loading @@ -1029,13 +1040,13 @@ TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData_Without ASSERT_BINDER_SUCCESS(service->createAppData(args, &result)); // 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 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::CreateAppDataArgs args = createAppDataArgs(); args.packageName = "com.foo"; Loading @@ -1045,10 +1056,10 @@ TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData_Without ASSERT_BINDER_SUCCESS(service->createAppData(args, &result)); // 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 CheckFileAccess("misc_de/0/supplemental/com.foo", kSystemUid, S_IFDIR | 0751); CheckFileAccess("misc_de/0/sdksandbox/com.foo", kSystemUid, S_IFDIR | 0751); } } // namespace installd Loading cmds/installd/tests/installd_utils_test.cpp +25 −27 Original line number Diff line number Diff line Loading @@ -658,38 +658,36 @@ TEST_F(UtilsTest, TestCreateDirIfNeeded) { 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 EXPECT_EQ("/data/misc_ce/0/supplemental", create_data_misc_supplemental_path(nullptr, /*isCeData=*/true, 0)); EXPECT_EQ("/data/misc_ce/10/supplemental", create_data_misc_supplemental_path(nullptr, true, 10)); EXPECT_EQ("/data/misc_ce/0/sdksandbox", create_data_misc_sdk_sandbox_path(nullptr, /*isCeData=*/true, 0)); EXPECT_EQ("/data/misc_ce/10/sdksandbox", create_data_misc_sdk_sandbox_path(nullptr, true, 10)); EXPECT_EQ("/data/misc_ce/0/supplemental/com.foo", create_data_misc_supplemental_package_path(nullptr, true, 0, "com.foo")); EXPECT_EQ("/data/misc_ce/10/supplemental/com.foo", create_data_misc_supplemental_package_path(nullptr, true, 10, "com.foo")); EXPECT_EQ("/data/misc_ce/0/sdksandbox/com.foo", create_data_misc_sdk_sandbox_package_path(nullptr, true, 0, "com.foo")); EXPECT_EQ("/data/misc_ce/10/sdksandbox/com.foo", create_data_misc_sdk_sandbox_package_path(nullptr, true, 10, "com.foo")); EXPECT_EQ("/data/misc_ce/0/supplemental/com.foo/shared", create_data_misc_supplemental_shared_path(nullptr, true, 0, "com.foo")); EXPECT_EQ("/data/misc_ce/10/supplemental/com.foo/shared", create_data_misc_supplemental_shared_path(nullptr, true, 10, "com.foo")); EXPECT_EQ("/data/misc_ce/0/sdksandbox/com.foo/shared", create_data_misc_sdk_sandbox_shared_path(nullptr, true, 0, "com.foo")); EXPECT_EQ("/data/misc_ce/10/sdksandbox/com.foo/shared", create_data_misc_sdk_sandbox_shared_path(nullptr, true, 10, "com.foo")); // De data paths EXPECT_EQ("/data/misc_de/0/supplemental", create_data_misc_supplemental_path(nullptr, /*isCeData=*/false, 0)); EXPECT_EQ("/data/misc_de/10/supplemental", create_data_misc_supplemental_path(nullptr, false, 10)); EXPECT_EQ("/data/misc_de/0/supplemental/com.foo", create_data_misc_supplemental_package_path(nullptr, false, 0, "com.foo")); EXPECT_EQ("/data/misc_de/10/supplemental/com.foo", create_data_misc_supplemental_package_path(nullptr, false, 10, "com.foo")); EXPECT_EQ("/data/misc_de/0/supplemental/com.foo/shared", create_data_misc_supplemental_shared_path(nullptr, false, 0, "com.foo")); EXPECT_EQ("/data/misc_de/10/supplemental/com.foo/shared", create_data_misc_supplemental_shared_path(nullptr, false, 10, "com.foo")); EXPECT_EQ("/data/misc_de/0/sdksandbox", create_data_misc_sdk_sandbox_path(nullptr, /*isCeData=*/false, 0)); EXPECT_EQ("/data/misc_de/10/sdksandbox", create_data_misc_sdk_sandbox_path(nullptr, false, 10)); EXPECT_EQ("/data/misc_de/0/sdksandbox/com.foo", create_data_misc_sdk_sandbox_package_path(nullptr, false, 0, "com.foo")); EXPECT_EQ("/data/misc_de/10/sdksandbox/com.foo", create_data_misc_sdk_sandbox_package_path(nullptr, false, 10, "com.foo")); EXPECT_EQ("/data/misc_de/0/sdksandbox/com.foo/shared", create_data_misc_sdk_sandbox_shared_path(nullptr, false, 0, "com.foo")); EXPECT_EQ("/data/misc_de/10/sdksandbox/com.foo/shared", create_data_misc_sdk_sandbox_shared_path(nullptr, false, 10, "com.foo")); } TEST_F(UtilsTest, WaitChild) { Loading cmds/installd/utils.cpp +14 −14 Original line number Diff line number Diff line Loading @@ -198,38 +198,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. * E.g. /data/misc_ce/0/supplemental * Create the path name where sdk_sandbox data for all apps will be stored. * 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)); 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 { 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. * 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) { check_package_name(package_name); 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); } /** * 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) { 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) .c_str()); } Loading Loading
cmds/installd/InstalldNativeService.cpp +22 −18 Original line number 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 // 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) { auto status = createAppDirectoryForSupplementalData(uuid, packageName, userId, appId, previousAppId, seInfo, flags); auto status = createSdkSandboxDataDirectory(uuid, packageName, userId, appId, previousAppId, seInfo, flags); if (!status.isOk()) { 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 */ binder::Status InstalldNativeService::createAppDirectoryForSupplementalData( binder::Status InstalldNativeService::createSdkSandboxDataDirectory( 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 supplementalUid = multiuser_get_supplemental_uid(userId, appId); if (supplementalUid == -1) { // There no valid supplemental process for this app. Skip creation of data directory int32_t sdkSandboxUid = multiuser_get_sdk_sandbox_uid(userId, appId); if (sdkSandboxUid == -1) { // There no valid sdk sandbox process for this app. Skip creation of data directory return ok(); } Loading @@ -759,35 +759,35 @@ binder::Status InstalldNativeService::createAppDirectoryForSupplementalData( } 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 // 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()); if (prepare_app_dir(appPath, 0751, AID_SYSTEM)) { return error("Failed to prepare " + appPath); } // 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()); 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); if (cacheGid == -1) { 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, cacheGid, seInfo, 0700); auto status = createAppDataDirs(sharedPath, sdkSandboxUid, &previousSdkSandboxUid, cacheGid, seInfo, 0700); if (!status.isOk()) { return status; } // 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 } Loading Loading @@ -2084,6 +2084,10 @@ binder::Status InstalldNativeService::getAppSize(const std::optional<std::string const std::vector<std::string>& codePaths, std::vector<int64_t>* _aidl_return) { ENFORCE_UID(AID_SYSTEM); CHECK_ARGUMENT_UUID(uuid); if (packageNames.size() != ceDataInodes.size()) { return exception(binder::Status::EX_ILLEGAL_ARGUMENT, "packageNames/ceDataInodes size mismatch."); } for (const auto& packageName : packageNames) { CHECK_ARGUMENT_PACKAGE_NAME(packageName); } Loading
cmds/installd/InstalldNativeService.h +4 −5 Original line number Diff line number Diff line Loading @@ -205,10 +205,9 @@ private: const std::string& seInfo, int32_t targetSdkVersion, int64_t* _aidl_return); binder::Status createAppDirectoryForSupplementalData(const std::optional<std::string>& uuid, const std::string& packageName, int32_t userId, int32_t appId, int32_t previousAppId, binder::Status createSdkSandboxDataDirectory(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); }; Loading
cmds/installd/tests/installd_service_test.cpp +32 −21 Original line number Diff line number Diff line Loading @@ -81,7 +81,7 @@ static constexpr const int32_t kTestUserId = 0; static constexpr const uid_t kTestAppId = 19999; 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 Loading Loading @@ -491,6 +491,19 @@ TEST_F(ServiceTest, GetAppSize) { system(removeCommand.c_str()); } } TEST_F(ServiceTest, GetAppSizeWrongSizes) { int32_t externalStorageAppId = -1; std::vector<int64_t> externalStorageSize; std::vector<std::string> codePaths; std::vector<std::string> packageNames = {"package1", "package2"}; std::vector<int64_t> ceDataInodes = {0}; EXPECT_BINDER_FAIL(service->getAppSize(std::nullopt, packageNames, 0, InstalldNativeService::FLAG_USE_QUOTA, externalStorageAppId, ceDataInodes, codePaths, &externalStorageSize)); } static bool mkdirs(const std::string& path, mode_t mode) { struct stat sb; if (stat(path.c_str(), &sb) != -1 && S_ISDIR(sb.st_mode)) { Loading Loading @@ -936,7 +949,7 @@ TEST_F(AppDataSnapshotTest, RestoreAppDataSnapshot_WrongVolumeUuid) { "com.foo", 10000, "", 0, 41, FLAG_STORAGE_DE)); } class AppSupplementalDataTest : public testing::Test { class SdkSandboxDataTest : public testing::Test { public: void CheckFileAccess(const std::string& path, uid_t uid, mode_t mode) { const auto fullPath = "/data/local/tmp/" + path; Loading Loading @@ -973,8 +986,8 @@ protected: clearAppData(); 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/misc_ce/0/supplemental", 0700)); ASSERT_TRUE(mkdirs("/data/local/tmp/misc_de/0/supplemental", 0700)); ASSERT_TRUE(mkdirs("/data/local/tmp/misc_ce/0/sdksandbox", 0700)); ASSERT_TRUE(mkdirs("/data/local/tmp/misc_de/0/sdksandbox", 0700)); init_globals_from_data_and_root(); } Loading @@ -993,7 +1006,7 @@ private: } }; TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData) { TEST_F(SdkSandboxDataTest, CreateAppData_CreatesSupplementalAppData) { android::os::CreateAppDataResult result; android::os::CreateAppDataArgs args = createAppDataArgs(); args.packageName = "com.foo"; Loading @@ -1002,24 +1015,22 @@ TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData) { // Create the app user data. ASSERT_BINDER_SUCCESS(service->createAppData(args, &result)); CheckFileAccess("misc_ce/0/supplemental/com.foo", kSystemUid, S_IFDIR | 0751); CheckFileAccess("misc_ce/0/supplemental/com.foo/shared", kTestAppSupplementalUid, S_IFDIR | 0700); CheckFileAccess("misc_ce/0/supplemental/com.foo/shared/cache", kTestAppSupplementalUid, CheckFileAccess("misc_ce/0/sdksandbox/com.foo", kSystemUid, S_IFDIR | 0751); CheckFileAccess("misc_ce/0/sdksandbox/com.foo/shared", kTestSdkSandboxUid, S_IFDIR | 0700); CheckFileAccess("misc_ce/0/sdksandbox/com.foo/shared/cache", kTestSdkSandboxUid, 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); CheckFileAccess("misc_de/0/supplemental/com.foo", kSystemUid, S_IFDIR | 0751); CheckFileAccess("misc_de/0/supplemental/com.foo/shared", kTestAppSupplementalUid, S_IFDIR | 0700); CheckFileAccess("misc_de/0/supplemental/com.foo/shared/cache", kTestAppSupplementalUid, CheckFileAccess("misc_de/0/sdksandbox/com.foo", kSystemUid, S_IFDIR | 0751); CheckFileAccess("misc_de/0/sdksandbox/com.foo/shared", kTestSdkSandboxUid, S_IFDIR | 0700); CheckFileAccess("misc_de/0/sdksandbox/com.foo/shared/cache", kTestSdkSandboxUid, 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); } TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData_WithoutDeFlag) { TEST_F(SdkSandboxDataTest, CreateAppData_CreatesSupplementalAppData_WithoutDeFlag) { android::os::CreateAppDataResult result; android::os::CreateAppDataArgs args = createAppDataArgs(); args.packageName = "com.foo"; Loading @@ -1029,13 +1040,13 @@ TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData_Without ASSERT_BINDER_SUCCESS(service->createAppData(args, &result)); // 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 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::CreateAppDataArgs args = createAppDataArgs(); args.packageName = "com.foo"; Loading @@ -1045,10 +1056,10 @@ TEST_F(AppSupplementalDataTest, CreateAppData_CreatesSupplementalAppData_Without ASSERT_BINDER_SUCCESS(service->createAppData(args, &result)); // 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 CheckFileAccess("misc_de/0/supplemental/com.foo", kSystemUid, S_IFDIR | 0751); CheckFileAccess("misc_de/0/sdksandbox/com.foo", kSystemUid, S_IFDIR | 0751); } } // namespace installd Loading
cmds/installd/tests/installd_utils_test.cpp +25 −27 Original line number Diff line number Diff line Loading @@ -658,38 +658,36 @@ TEST_F(UtilsTest, TestCreateDirIfNeeded) { 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 EXPECT_EQ("/data/misc_ce/0/supplemental", create_data_misc_supplemental_path(nullptr, /*isCeData=*/true, 0)); EXPECT_EQ("/data/misc_ce/10/supplemental", create_data_misc_supplemental_path(nullptr, true, 10)); EXPECT_EQ("/data/misc_ce/0/sdksandbox", create_data_misc_sdk_sandbox_path(nullptr, /*isCeData=*/true, 0)); EXPECT_EQ("/data/misc_ce/10/sdksandbox", create_data_misc_sdk_sandbox_path(nullptr, true, 10)); EXPECT_EQ("/data/misc_ce/0/supplemental/com.foo", create_data_misc_supplemental_package_path(nullptr, true, 0, "com.foo")); EXPECT_EQ("/data/misc_ce/10/supplemental/com.foo", create_data_misc_supplemental_package_path(nullptr, true, 10, "com.foo")); EXPECT_EQ("/data/misc_ce/0/sdksandbox/com.foo", create_data_misc_sdk_sandbox_package_path(nullptr, true, 0, "com.foo")); EXPECT_EQ("/data/misc_ce/10/sdksandbox/com.foo", create_data_misc_sdk_sandbox_package_path(nullptr, true, 10, "com.foo")); EXPECT_EQ("/data/misc_ce/0/supplemental/com.foo/shared", create_data_misc_supplemental_shared_path(nullptr, true, 0, "com.foo")); EXPECT_EQ("/data/misc_ce/10/supplemental/com.foo/shared", create_data_misc_supplemental_shared_path(nullptr, true, 10, "com.foo")); EXPECT_EQ("/data/misc_ce/0/sdksandbox/com.foo/shared", create_data_misc_sdk_sandbox_shared_path(nullptr, true, 0, "com.foo")); EXPECT_EQ("/data/misc_ce/10/sdksandbox/com.foo/shared", create_data_misc_sdk_sandbox_shared_path(nullptr, true, 10, "com.foo")); // De data paths EXPECT_EQ("/data/misc_de/0/supplemental", create_data_misc_supplemental_path(nullptr, /*isCeData=*/false, 0)); EXPECT_EQ("/data/misc_de/10/supplemental", create_data_misc_supplemental_path(nullptr, false, 10)); EXPECT_EQ("/data/misc_de/0/supplemental/com.foo", create_data_misc_supplemental_package_path(nullptr, false, 0, "com.foo")); EXPECT_EQ("/data/misc_de/10/supplemental/com.foo", create_data_misc_supplemental_package_path(nullptr, false, 10, "com.foo")); EXPECT_EQ("/data/misc_de/0/supplemental/com.foo/shared", create_data_misc_supplemental_shared_path(nullptr, false, 0, "com.foo")); EXPECT_EQ("/data/misc_de/10/supplemental/com.foo/shared", create_data_misc_supplemental_shared_path(nullptr, false, 10, "com.foo")); EXPECT_EQ("/data/misc_de/0/sdksandbox", create_data_misc_sdk_sandbox_path(nullptr, /*isCeData=*/false, 0)); EXPECT_EQ("/data/misc_de/10/sdksandbox", create_data_misc_sdk_sandbox_path(nullptr, false, 10)); EXPECT_EQ("/data/misc_de/0/sdksandbox/com.foo", create_data_misc_sdk_sandbox_package_path(nullptr, false, 0, "com.foo")); EXPECT_EQ("/data/misc_de/10/sdksandbox/com.foo", create_data_misc_sdk_sandbox_package_path(nullptr, false, 10, "com.foo")); EXPECT_EQ("/data/misc_de/0/sdksandbox/com.foo/shared", create_data_misc_sdk_sandbox_shared_path(nullptr, false, 0, "com.foo")); EXPECT_EQ("/data/misc_de/10/sdksandbox/com.foo/shared", create_data_misc_sdk_sandbox_shared_path(nullptr, false, 10, "com.foo")); } TEST_F(UtilsTest, WaitChild) { Loading
cmds/installd/utils.cpp +14 −14 Original line number Diff line number Diff line Loading @@ -198,38 +198,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. * E.g. /data/misc_ce/0/supplemental * Create the path name where sdk_sandbox data for all apps will be stored. * 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)); 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 { 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. * 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) { check_package_name(package_name); 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); } /** * 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) { 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) .c_str()); } Loading