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

Commit d4056389 authored by Song Chun Fan's avatar Song Chun Fan
Browse files

[pm] fix potential ArrayIndexOutOfBoundsExceptions in user array calculations

BUG: 363449841
FIXES: 363449841
Test: presubmit
FLAG: EXEMPT bug fix

Change-Id: I5706932169087671f7a7b1a6620b63e5d76f06cd
parent 7eedb2d0
Loading
Loading
Loading
Loading
+10 −36
Original line number Original line Diff line number Diff line
@@ -42,6 +42,7 @@ import android.service.pm.PackageProto.UserInfoProto.ArchiveState.ArchiveActivit
import android.text.TextUtils;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.ArraySet;
import android.util.IntArray;
import android.util.SparseArray;
import android.util.SparseArray;
import android.util.proto.ProtoOutputStream;
import android.util.proto.ProtoOutputStream;


@@ -981,39 +982,23 @@ public class PackageSetting extends SettingBase implements PackageStateInternal
    }
    }


    int[] queryInstalledUsers(int[] users, boolean installed) {
    int[] queryInstalledUsers(int[] users, boolean installed) {
        int num = 0;
        IntArray installedUsers = new IntArray(users.length);
        for (int user : users) {
        for (int user : users) {
            if (getInstalled(user) == installed) {
            if (getInstalled(user) == installed) {
                num++;
                installedUsers.add(user);
            }
            }
        }
        }
        int[] res = new int[num];
        return installedUsers.toArray();
        num = 0;
        for (int user : users) {
            if (getInstalled(user) == installed) {
                res[num] = user;
                num++;
            }
        }
        return res;
    }
    }


    int[] queryUsersInstalledOrHasData(int[] users) {
    int[] queryUsersInstalledOrHasData(int[] users) {
        int num = 0;
        IntArray usersInstalledOrHasData = new IntArray(users.length);
        for (int user : users) {
            if (getInstalled(user) || readUserState(user).dataExists()) {
                num++;
            }
        }
        int[] res = new int[num];
        num = 0;
        for (int user : users) {
        for (int user : users) {
            if (getInstalled(user) || readUserState(user).dataExists()) {
            if (getInstalled(user) || readUserState(user).dataExists()) {
                res[num] = user;
                usersInstalledOrHasData.add(user);
                num++;
            }
            }
        }
        }
        return res;
        return usersInstalledOrHasData.toArray();
    }
    }


    long getCeDataInode(int userId) {
    long getCeDataInode(int userId) {
@@ -1283,25 +1268,14 @@ public class PackageSetting extends SettingBase implements PackageStateInternal
    }
    }


    public int[] getNotInstalledUserIds() {
    public int[] getNotInstalledUserIds() {
        int count = 0;
        int userStateCount = mUserStates.size();
        int userStateCount = mUserStates.size();
        IntArray notInstalledUsers = new IntArray(userStateCount);
        for (int i = 0; i < userStateCount; i++) {
        for (int i = 0; i < userStateCount; i++) {
            if (!mUserStates.valueAt(i).isInstalled()) {
            if (!mUserStates.valueAt(i).isInstalled()) {
                count++;
                notInstalledUsers.add(mUserStates.keyAt(i));
            }
        }
        if (count == 0) {
            return EmptyArray.INT;
        }

        int[] excludedUserIds = new int[count];
        int idx = 0;
        for (int i = 0; i < userStateCount; i++) {
            if (!mUserStates.valueAt(i).isInstalled()) {
                excludedUserIds[idx++] = mUserStates.keyAt(i);
            }
            }
        }
        }
        return excludedUserIds;
        return notInstalledUsers.toArray();
    }
    }


    /**
    /**