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

Commit f0ea70ec authored by John Wu's avatar John Wu Committed by Gerrit Code Review
Browse files

Merge "Remove complicated previousAppId usage"

parents d2ce603b 841a8024
Loading
Loading
Loading
Loading
+10 −19
Original line number Original line Diff line number Diff line
@@ -634,7 +634,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{};
@@ -646,14 +646,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);
            }
            }
        }
        }
@@ -703,12 +697,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;
@@ -724,7 +715,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;
@@ -750,12 +741,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);
        }
        }


@@ -955,7 +946,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;