diff options
| -rw-r--r-- | cmds/installd/InstalldNativeService.cpp | 29 |
1 files changed, 10 insertions, 19 deletions
diff --git a/cmds/installd/InstalldNativeService.cpp b/cmds/installd/InstalldNativeService.cpp index d20a8289ea..397d4326d6 100644 --- a/cmds/installd/InstalldNativeService.cpp +++ b/cmds/installd/InstalldNativeService.cpp @@ -633,7 +633,7 @@ static void chown_app_profile_dir(const std::string &packageName, int32_t appId, } static binder::Status createAppDataDirs(const std::string& path, int32_t uid, int32_t gid, - int32_t* previousUid, int32_t cacheGid, + int32_t previousUid, int32_t cacheGid, const std::string& seInfo, mode_t targetMode, long projectIdApp, long projectIdCache) { struct stat st{}; @@ -645,14 +645,8 @@ static binder::Status createAppDataDirs(const std::string& path, int32_t uid, in bool code_cache_exists = (access(code_cache_path.c_str(), F_OK) == 0); if (parent_dir_exists) { - if (*previousUid < 0) { - // If previousAppId is -1 in CreateAppDataArgs, we will assume the current owner - // of the directory as previousUid. This is required because it is not always possible - // to chown app data during app upgrade (e.g. secondary users' CE storage not unlocked) - *previousUid = st.st_uid; - } - if (*previousUid != uid) { - if (!chown_app_dir(path, uid, *previousUid, cacheGid)) { + if (previousUid > 0 && previousUid != uid) { + if (!chown_app_dir(path, uid, previousUid, cacheGid)) { return error("Failed to chown " + path); } } @@ -702,12 +696,9 @@ binder::Status InstalldNativeService::createAppDataLocked( int32_t uid = multiuser_get_uid(userId, appId); - // If previousAppId < 0, we will use the existing app data owner as previousAppUid - // If previousAppId == 0, we use uid as previousUid (no data migration will happen) - // if previousAppId > 0, an app is upgrading and changing its app ID - int32_t previousUid = previousAppId > 0 - ? (int32_t) multiuser_get_uid(userId, previousAppId) - : (previousAppId == 0 ? uid : -1); + // If previousAppId > 0, an app is changing its app ID + int32_t previousUid = + previousAppId > 0 ? (int32_t)multiuser_get_uid(userId, previousAppId) : -1; int32_t cacheGid = multiuser_get_cache_gid(userId, appId); mode_t targetMode = targetSdkVersion >= MIN_RESTRICTED_HOME_SDK_VERSION ? 0700 : 0751; @@ -723,7 +714,7 @@ binder::Status InstalldNativeService::createAppDataLocked( if (flags & FLAG_STORAGE_CE) { auto path = create_data_user_ce_package_path(uuid_, userId, pkgname); - auto status = createAppDataDirs(path, uid, uid, &previousUid, cacheGid, seInfo, targetMode, + auto status = createAppDataDirs(path, uid, uid, previousUid, cacheGid, seInfo, targetMode, projectIdApp, projectIdCache); if (!status.isOk()) { return status; @@ -749,12 +740,12 @@ binder::Status InstalldNativeService::createAppDataLocked( if (flags & FLAG_STORAGE_DE) { auto path = create_data_user_de_package_path(uuid_, userId, pkgname); - auto status = createAppDataDirs(path, uid, uid, &previousUid, cacheGid, seInfo, targetMode, + auto status = createAppDataDirs(path, uid, uid, previousUid, cacheGid, seInfo, targetMode, projectIdApp, projectIdCache); if (!status.isOk()) { return status; } - if (previousUid != uid) { + if (previousUid > 0 && previousUid != uid) { chown_app_profile_dir(packageName, appId, userId); } @@ -954,7 +945,7 @@ binder::Status InstalldNativeService::reconcileSdkData(const std::optional<std:: long projectIdApp = get_project_id(appUid, PROJECT_ID_APP_START); long projectIdCache = get_project_id(appUid, PROJECT_ID_APP_CACHE_START); auto status = - createAppDataDirs(path, sandboxUid, AID_NOBODY, &previousSandboxUid, cacheGid, + createAppDataDirs(path, sandboxUid, AID_NOBODY, previousSandboxUid, cacheGid, seInfo, 0700 | S_ISGID, projectIdApp, projectIdCache); if (!status.isOk()) { res = status; |