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

Commit 484b48b1 authored by Hai Zhang's avatar Hai Zhang
Browse files

Quick fix for NPE in onPackageUninstalled() for UPS.

When users are removed and created by tests, there may be a race
condition so that onPackageUninstalled() is called with a user ID that
no longer exists. The call site is hard to fix because it's nested
inside too many layers of package manager logic, but we can at least
detect and skip it in onPackageUninstalled().

Fixes: 282988200
Test: atest CtsDevicePolicyTestCases:android.devicepolicy.cts.UserRestrictionsTest
Change-Id: I719a46eb8675bcb880d60bac0a79fb6714ac8914
parent 3eb06511
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ import android.util.Slog;
import android.util.SparseArray;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.Preconditions;
import com.android.internal.util.function.TriFunction;
import com.android.server.LocalServices;
@@ -722,6 +723,16 @@ public class PermissionManagerService extends IPermissionManager.Stub {
        public void onPackageUninstalled(@NonNull String packageName, int appId,
                @NonNull PackageState packageState, @Nullable AndroidPackage pkg,
                @NonNull List<AndroidPackage> sharedUserPkgs, @UserIdInt int userId) {
            if (userId != UserHandle.USER_ALL) {
                final int[] userIds = getAllUserIds();
                if (!ArrayUtils.contains(userIds, userId)) {
                    // This may happen due to DeletePackageHelper.removeUnusedPackagesLPw() calling
                    // deletePackageX() asynchronously.
                    Slog.w(LOG_TAG, "Skipping onPackageUninstalled() for non-existent user "
                            + userId);
                    return;
                }
            }
            mPermissionManagerServiceImpl.onPackageUninstalled(packageName, appId, packageState,
                    pkg, sharedUserPkgs, userId);
        }