Loading cmds/installd/InstalldNativeService.cpp +21 −8 Original line number Diff line number Diff line Loading @@ -757,7 +757,7 @@ static binder::Status createAppDataDirs(const std::string& path, int32_t uid, in binder::Status InstalldNativeService::createAppDataLocked( const std::optional<std::string>& uuid, const std::string& packageName, int32_t userId, int32_t flags, int32_t appId, int32_t previousAppId, const std::string& seInfo, int32_t targetSdkVersion, int64_t* _aidl_return) { int32_t targetSdkVersion, int64_t* ceDataInode, int64_t* deDataInode) { ENFORCE_UID(AID_SYSTEM); ENFORCE_VALID_USER(userId); CHECK_ARGUMENT_UUID(uuid); Loading @@ -767,7 +767,8 @@ binder::Status InstalldNativeService::createAppDataLocked( const char* pkgname = packageName.c_str(); // Assume invalid inode unless filled in below if (_aidl_return != nullptr) *_aidl_return = -1; if (ceDataInode != nullptr) *ceDataInode = -1; if (deDataInode != nullptr) *deDataInode = -1; int32_t uid = multiuser_get_uid(userId, appId); Loading Loading @@ -805,12 +806,12 @@ binder::Status InstalldNativeService::createAppDataLocked( // And return the CE inode of the top-level data directory so we can // clear contents while CE storage is locked if (_aidl_return != nullptr) { if (ceDataInode != nullptr) { ino_t result; if (get_path_inode(path, &result) != 0) { return error("Failed to get_path_inode for " + path); } *_aidl_return = static_cast<uint64_t>(result); *ceDataInode = static_cast<uint64_t>(result); } } if (flags & FLAG_STORAGE_DE) { Loading @@ -829,6 +830,14 @@ binder::Status InstalldNativeService::createAppDataLocked( if (!prepare_app_profile_dir(packageName, appId, userId)) { return error("Failed to prepare profiles for " + packageName); } if (deDataInode != nullptr) { ino_t result; if (get_path_inode(path, &result) != 0) { return error("Failed to get_path_inode for " + path); } *deDataInode = static_cast<uint64_t>(result); } } if (flags & FLAG_STORAGE_SDK) { Loading Loading @@ -892,14 +901,14 @@ binder::Status InstalldNativeService::createSdkSandboxDataPackageDirectory( binder::Status InstalldNativeService::createAppData( const std::optional<std::string>& uuid, const std::string& packageName, int32_t userId, int32_t flags, int32_t appId, int32_t previousAppId, const std::string& seInfo, int32_t targetSdkVersion, int64_t* _aidl_return) { int32_t targetSdkVersion, int64_t* ceDataInode, int64_t* deDataInode) { ENFORCE_UID(AID_SYSTEM); ENFORCE_VALID_USER(userId); CHECK_ARGUMENT_UUID(uuid); CHECK_ARGUMENT_PACKAGE_NAME(packageName); LOCK_PACKAGE_USER(); return createAppDataLocked(uuid, packageName, userId, flags, appId, previousAppId, seInfo, targetSdkVersion, _aidl_return); targetSdkVersion, ceDataInode, deDataInode); } binder::Status InstalldNativeService::createAppData( Loading @@ -910,9 +919,12 @@ binder::Status InstalldNativeService::createAppData( // Locking is performed depeer in the callstack. int64_t ceDataInode = -1; int64_t deDataInode = -1; auto status = createAppData(args.uuid, args.packageName, args.userId, args.flags, args.appId, args.previousAppId, args.seInfo, args.targetSdkVersion, &ceDataInode); args.previousAppId, args.seInfo, args.targetSdkVersion, &ceDataInode, &deDataInode); _aidl_return->ceDataInode = ceDataInode; _aidl_return->deDataInode = deDataInode; _aidl_return->exceptionCode = status.exceptionCode(); _aidl_return->exceptionMessage = status.exceptionMessage(); return ok(); Loading Loading @@ -1839,7 +1851,8 @@ binder::Status InstalldNativeService::moveCompleteApp(const std::optional<std::s } if (!createAppDataLocked(toUuid, packageName, userId, FLAG_STORAGE_CE | FLAG_STORAGE_DE, appId, /* previousAppId */ -1, seInfo, targetSdkVersion, nullptr) appId, /* previousAppId */ -1, seInfo, targetSdkVersion, nullptr, nullptr) .isOk()) { res = error("Failed to create package target"); goto fail; Loading cmds/installd/InstalldNativeService.h +3 −2 Original line number Diff line number Diff line Loading @@ -68,7 +68,8 @@ public: binder::Status createAppData(const std::optional<std::string>& uuid, const std::string& packageName, int32_t userId, int32_t flags, int32_t appId, int32_t previousAppId, const std::string& seInfo, int32_t targetSdkVersion, int64_t* _aidl_return); int32_t targetSdkVersion, int64_t* ceDataInode, int64_t* deDataInode); binder::Status createAppData( const android::os::CreateAppDataArgs& args, Loading Loading @@ -238,7 +239,7 @@ private: const std::string& packageName, int32_t userId, int32_t flags, int32_t appId, int32_t previousAppId, const std::string& seInfo, int32_t targetSdkVersion, int64_t* _aidl_return); int64_t* ceDataInode, int64_t* deDataInode); binder::Status restoreconAppDataLocked(const std::optional<std::string>& uuid, const std::string& packageName, int32_t userId, int32_t flags, int32_t appId, const std::string& seInfo); Loading cmds/installd/binder/android/os/CreateAppDataResult.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package android.os; /** {@hide} */ parcelable CreateAppDataResult { long ceDataInode; long deDataInode; int exceptionCode; @utf8InCpp String exceptionMessage; } cmds/installd/tests/installd_dexopt_test.cpp +14 −30 Original line number Diff line number Diff line Loading @@ -197,6 +197,7 @@ protected: std::string app_oat_dir_; int64_t ce_data_inode_; int64_t de_data_inode_; std::string secondary_dex_ce_; std::string secondary_dex_ce_link_; Loading Loading @@ -261,16 +262,10 @@ protected: } // Create the app user data. binder::Status status = service_->createAppData( volume_uuid_, package_name_, kTestUserId, kAppDataFlags, kTestAppUid, 0 /* previousAppId */, se_info_, kOSdkVersion, &ce_data_inode_); binder::Status status = service_->createAppData(volume_uuid_, package_name_, kTestUserId, kAppDataFlags, kTestAppUid, 0 /* previousAppId */, se_info_, kOSdkVersion, &ce_data_inode_, &de_data_inode_); if (!status.isOk()) { return ::testing::AssertionFailure() << "Could not create app data: " << status.toString8().c_str(); Loading Loading @@ -1350,16 +1345,10 @@ TEST_F(ProfileTest, ProfileDirOkAfterFixup) { ASSERT_EQ(0, chmod(ref_profile_dir.c_str(), 0700)); // Run createAppData again which will offer to fix-up the profile directories. ASSERT_BINDER_SUCCESS(service_->createAppData( volume_uuid_, package_name_, kTestUserId, kAppDataFlags, kTestAppUid, 0 /* previousAppId */, se_info_, kOSdkVersion, &ce_data_inode_)); ASSERT_BINDER_SUCCESS(service_->createAppData(volume_uuid_, package_name_, kTestUserId, kAppDataFlags, kTestAppUid, 0 /* previousAppId */, se_info_, kOSdkVersion, &ce_data_inode_, &de_data_inode_)); // Check the file access. CheckFileAccess(cur_profile_dir, kTestAppUid, kTestAppUid, 0700 | S_IFDIR); Loading Loading @@ -1492,18 +1481,13 @@ class BootProfileTest : public ProfileTest { void createAppProfilesForBootMerge(size_t number_of_profiles) { for (size_t i = 0; i < number_of_profiles; i++) { int64_t ce_data_inode; int64_t de_data_inode; std::string package_name = "dummy_test_pkg" + std::to_string(i); LOG(INFO) << package_name; ASSERT_BINDER_SUCCESS(service_->createAppData( volume_uuid_, package_name, kTestUserId, kAppDataFlags, kTestAppUid, 0 /* previousAppId */, se_info_, kOSdkVersion, &ce_data_inode)); ASSERT_BINDER_SUCCESS( service_->createAppData(volume_uuid_, package_name, kTestUserId, kAppDataFlags, kTestAppUid, 0 /* previousAppId */, se_info_, kOSdkVersion, &ce_data_inode, &de_data_inode)); extra_apps_.push_back(package_name); extra_ce_data_inodes_.push_back(ce_data_inode); std::string profile = create_current_profile_path( Loading Loading
cmds/installd/InstalldNativeService.cpp +21 −8 Original line number Diff line number Diff line Loading @@ -757,7 +757,7 @@ static binder::Status createAppDataDirs(const std::string& path, int32_t uid, in binder::Status InstalldNativeService::createAppDataLocked( const std::optional<std::string>& uuid, const std::string& packageName, int32_t userId, int32_t flags, int32_t appId, int32_t previousAppId, const std::string& seInfo, int32_t targetSdkVersion, int64_t* _aidl_return) { int32_t targetSdkVersion, int64_t* ceDataInode, int64_t* deDataInode) { ENFORCE_UID(AID_SYSTEM); ENFORCE_VALID_USER(userId); CHECK_ARGUMENT_UUID(uuid); Loading @@ -767,7 +767,8 @@ binder::Status InstalldNativeService::createAppDataLocked( const char* pkgname = packageName.c_str(); // Assume invalid inode unless filled in below if (_aidl_return != nullptr) *_aidl_return = -1; if (ceDataInode != nullptr) *ceDataInode = -1; if (deDataInode != nullptr) *deDataInode = -1; int32_t uid = multiuser_get_uid(userId, appId); Loading Loading @@ -805,12 +806,12 @@ binder::Status InstalldNativeService::createAppDataLocked( // And return the CE inode of the top-level data directory so we can // clear contents while CE storage is locked if (_aidl_return != nullptr) { if (ceDataInode != nullptr) { ino_t result; if (get_path_inode(path, &result) != 0) { return error("Failed to get_path_inode for " + path); } *_aidl_return = static_cast<uint64_t>(result); *ceDataInode = static_cast<uint64_t>(result); } } if (flags & FLAG_STORAGE_DE) { Loading @@ -829,6 +830,14 @@ binder::Status InstalldNativeService::createAppDataLocked( if (!prepare_app_profile_dir(packageName, appId, userId)) { return error("Failed to prepare profiles for " + packageName); } if (deDataInode != nullptr) { ino_t result; if (get_path_inode(path, &result) != 0) { return error("Failed to get_path_inode for " + path); } *deDataInode = static_cast<uint64_t>(result); } } if (flags & FLAG_STORAGE_SDK) { Loading Loading @@ -892,14 +901,14 @@ binder::Status InstalldNativeService::createSdkSandboxDataPackageDirectory( binder::Status InstalldNativeService::createAppData( const std::optional<std::string>& uuid, const std::string& packageName, int32_t userId, int32_t flags, int32_t appId, int32_t previousAppId, const std::string& seInfo, int32_t targetSdkVersion, int64_t* _aidl_return) { int32_t targetSdkVersion, int64_t* ceDataInode, int64_t* deDataInode) { ENFORCE_UID(AID_SYSTEM); ENFORCE_VALID_USER(userId); CHECK_ARGUMENT_UUID(uuid); CHECK_ARGUMENT_PACKAGE_NAME(packageName); LOCK_PACKAGE_USER(); return createAppDataLocked(uuid, packageName, userId, flags, appId, previousAppId, seInfo, targetSdkVersion, _aidl_return); targetSdkVersion, ceDataInode, deDataInode); } binder::Status InstalldNativeService::createAppData( Loading @@ -910,9 +919,12 @@ binder::Status InstalldNativeService::createAppData( // Locking is performed depeer in the callstack. int64_t ceDataInode = -1; int64_t deDataInode = -1; auto status = createAppData(args.uuid, args.packageName, args.userId, args.flags, args.appId, args.previousAppId, args.seInfo, args.targetSdkVersion, &ceDataInode); args.previousAppId, args.seInfo, args.targetSdkVersion, &ceDataInode, &deDataInode); _aidl_return->ceDataInode = ceDataInode; _aidl_return->deDataInode = deDataInode; _aidl_return->exceptionCode = status.exceptionCode(); _aidl_return->exceptionMessage = status.exceptionMessage(); return ok(); Loading Loading @@ -1839,7 +1851,8 @@ binder::Status InstalldNativeService::moveCompleteApp(const std::optional<std::s } if (!createAppDataLocked(toUuid, packageName, userId, FLAG_STORAGE_CE | FLAG_STORAGE_DE, appId, /* previousAppId */ -1, seInfo, targetSdkVersion, nullptr) appId, /* previousAppId */ -1, seInfo, targetSdkVersion, nullptr, nullptr) .isOk()) { res = error("Failed to create package target"); goto fail; Loading
cmds/installd/InstalldNativeService.h +3 −2 Original line number Diff line number Diff line Loading @@ -68,7 +68,8 @@ public: binder::Status createAppData(const std::optional<std::string>& uuid, const std::string& packageName, int32_t userId, int32_t flags, int32_t appId, int32_t previousAppId, const std::string& seInfo, int32_t targetSdkVersion, int64_t* _aidl_return); int32_t targetSdkVersion, int64_t* ceDataInode, int64_t* deDataInode); binder::Status createAppData( const android::os::CreateAppDataArgs& args, Loading Loading @@ -238,7 +239,7 @@ private: const std::string& packageName, int32_t userId, int32_t flags, int32_t appId, int32_t previousAppId, const std::string& seInfo, int32_t targetSdkVersion, int64_t* _aidl_return); int64_t* ceDataInode, int64_t* deDataInode); binder::Status restoreconAppDataLocked(const std::optional<std::string>& uuid, const std::string& packageName, int32_t userId, int32_t flags, int32_t appId, const std::string& seInfo); Loading
cmds/installd/binder/android/os/CreateAppDataResult.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package android.os; /** {@hide} */ parcelable CreateAppDataResult { long ceDataInode; long deDataInode; int exceptionCode; @utf8InCpp String exceptionMessage; }
cmds/installd/tests/installd_dexopt_test.cpp +14 −30 Original line number Diff line number Diff line Loading @@ -197,6 +197,7 @@ protected: std::string app_oat_dir_; int64_t ce_data_inode_; int64_t de_data_inode_; std::string secondary_dex_ce_; std::string secondary_dex_ce_link_; Loading Loading @@ -261,16 +262,10 @@ protected: } // Create the app user data. binder::Status status = service_->createAppData( volume_uuid_, package_name_, kTestUserId, kAppDataFlags, kTestAppUid, 0 /* previousAppId */, se_info_, kOSdkVersion, &ce_data_inode_); binder::Status status = service_->createAppData(volume_uuid_, package_name_, kTestUserId, kAppDataFlags, kTestAppUid, 0 /* previousAppId */, se_info_, kOSdkVersion, &ce_data_inode_, &de_data_inode_); if (!status.isOk()) { return ::testing::AssertionFailure() << "Could not create app data: " << status.toString8().c_str(); Loading Loading @@ -1350,16 +1345,10 @@ TEST_F(ProfileTest, ProfileDirOkAfterFixup) { ASSERT_EQ(0, chmod(ref_profile_dir.c_str(), 0700)); // Run createAppData again which will offer to fix-up the profile directories. ASSERT_BINDER_SUCCESS(service_->createAppData( volume_uuid_, package_name_, kTestUserId, kAppDataFlags, kTestAppUid, 0 /* previousAppId */, se_info_, kOSdkVersion, &ce_data_inode_)); ASSERT_BINDER_SUCCESS(service_->createAppData(volume_uuid_, package_name_, kTestUserId, kAppDataFlags, kTestAppUid, 0 /* previousAppId */, se_info_, kOSdkVersion, &ce_data_inode_, &de_data_inode_)); // Check the file access. CheckFileAccess(cur_profile_dir, kTestAppUid, kTestAppUid, 0700 | S_IFDIR); Loading Loading @@ -1492,18 +1481,13 @@ class BootProfileTest : public ProfileTest { void createAppProfilesForBootMerge(size_t number_of_profiles) { for (size_t i = 0; i < number_of_profiles; i++) { int64_t ce_data_inode; int64_t de_data_inode; std::string package_name = "dummy_test_pkg" + std::to_string(i); LOG(INFO) << package_name; ASSERT_BINDER_SUCCESS(service_->createAppData( volume_uuid_, package_name, kTestUserId, kAppDataFlags, kTestAppUid, 0 /* previousAppId */, se_info_, kOSdkVersion, &ce_data_inode)); ASSERT_BINDER_SUCCESS( service_->createAppData(volume_uuid_, package_name, kTestUserId, kAppDataFlags, kTestAppUid, 0 /* previousAppId */, se_info_, kOSdkVersion, &ce_data_inode, &de_data_inode)); extra_apps_.push_back(package_name); extra_ce_data_inodes_.push_back(ce_data_inode); std::string profile = create_current_profile_path( Loading