Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 76c5b21b authored by John Wu's avatar John Wu Committed by Automerger Merge Worker
Browse files

Merge "Remove complicated previousAppId usage" am: f0ea70ec am: 7771fa27...

Merge "Remove complicated previousAppId usage" am: f0ea70ec am: 7771fa27 am: d85390a5 am: 5fe67d40

Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/2016416



Change-Id: Ibd53fcd724b2664094aeb272da599250764b8ff2
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents dbbbe36e 5fe67d40
Loading
Loading
Loading
Loading
+10 −19
Original line number Original line Diff line number Diff line
@@ -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,
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,
                                        const std::string& seInfo, mode_t targetMode,
                                        long projectIdApp, long projectIdCache) {
                                        long projectIdApp, long projectIdCache) {
    struct stat st{};
    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);
    bool code_cache_exists = (access(code_cache_path.c_str(), F_OK) == 0);


    if (parent_dir_exists) {
    if (parent_dir_exists) {
        if (*previousUid < 0) {
        if (previousUid > 0 && previousUid != uid) {
            // If previousAppId is -1 in CreateAppDataArgs, we will assume the current owner
            if (!chown_app_dir(path, uid, previousUid, cacheGid)) {
            // 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)) {
                return error("Failed to chown " + path);
                return error("Failed to chown " + path);
            }
            }
        }
        }
@@ -702,12 +696,9 @@ binder::Status InstalldNativeService::createAppDataLocked(


    int32_t uid = multiuser_get_uid(userId, appId);
    int32_t uid = multiuser_get_uid(userId, appId);


    // If previousAppId < 0, we will use the existing app data owner as previousAppUid
    // If previousAppId > 0, an app is changing its app ID
    // If previousAppId == 0, we use uid as previousUid (no data migration will happen)
    int32_t previousUid =
    // if previousAppId > 0, an app is upgrading and changing its app ID
            previousAppId > 0 ? (int32_t)multiuser_get_uid(userId, previousAppId) : -1;
    int32_t previousUid = previousAppId > 0
        ? (int32_t) multiuser_get_uid(userId, previousAppId)
        : (previousAppId == 0 ? uid : -1);


    int32_t cacheGid = multiuser_get_cache_gid(userId, appId);
    int32_t cacheGid = multiuser_get_cache_gid(userId, appId);
    mode_t targetMode = targetSdkVersion >= MIN_RESTRICTED_HOME_SDK_VERSION ? 0700 : 0751;
    mode_t targetMode = targetSdkVersion >= MIN_RESTRICTED_HOME_SDK_VERSION ? 0700 : 0751;
@@ -723,7 +714,7 @@ binder::Status InstalldNativeService::createAppDataLocked(
    if (flags & FLAG_STORAGE_CE) {
    if (flags & FLAG_STORAGE_CE) {
        auto path = create_data_user_ce_package_path(uuid_, userId, pkgname);
        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);
                                        projectIdApp, projectIdCache);
        if (!status.isOk()) {
        if (!status.isOk()) {
            return status;
            return status;
@@ -749,12 +740,12 @@ binder::Status InstalldNativeService::createAppDataLocked(
    if (flags & FLAG_STORAGE_DE) {
    if (flags & FLAG_STORAGE_DE) {
        auto path = create_data_user_de_package_path(uuid_, userId, pkgname);
        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);
                                        projectIdApp, projectIdCache);
        if (!status.isOk()) {
        if (!status.isOk()) {
            return status;
            return status;
        }
        }
        if (previousUid != uid) {
        if (previousUid > 0 && previousUid != uid) {
            chown_app_profile_dir(packageName, appId, userId);
            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 projectIdApp = get_project_id(appUid, PROJECT_ID_APP_START);
            long projectIdCache = get_project_id(appUid, PROJECT_ID_APP_CACHE_START);
            long projectIdCache = get_project_id(appUid, PROJECT_ID_APP_CACHE_START);
            auto status =
            auto status =
                    createAppDataDirs(path, sandboxUid, AID_NOBODY, &previousSandboxUid, cacheGid,
                    createAppDataDirs(path, sandboxUid, AID_NOBODY, previousSandboxUid, cacheGid,
                                      seInfo, 0700 | S_ISGID, projectIdApp, projectIdCache);
                                      seInfo, 0700 | S_ISGID, projectIdApp, projectIdCache);
            if (!status.isOk()) {
            if (!status.isOk()) {
                res = status;
                res = status;