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

Commit 2b98fb36 authored by Hai Zhang's avatar Hai Zhang
Browse files

Fix AppOpsService setUidMode() when mode is 0 (MODE_ALLOWED).

Previously the code was calling SparseIntArray.get() without checking
for indexOfKey() >= 0 first, which leads to a default value of 0 that
collides with MODE_ALLOWED. This fix adds the check before get() is
called.

Test: manual
Change-Id: I04c183d6cd60cd1ec0babf47b905592c2fb62d4d
parent 6c109c76
Loading
Loading
Loading
Loading
+11 −10
Original line number Diff line number Diff line
@@ -16,6 +16,15 @@

package com.android.server;

import static android.app.AppOpsManager.UID_STATE_BACKGROUND;
import static android.app.AppOpsManager.UID_STATE_CACHED;
import static android.app.AppOpsManager.UID_STATE_FOREGROUND;
import static android.app.AppOpsManager.UID_STATE_FOREGROUND_SERVICE;
import static android.app.AppOpsManager.UID_STATE_LAST_NON_RESTRICTED;
import static android.app.AppOpsManager.UID_STATE_PERSISTENT;
import static android.app.AppOpsManager.UID_STATE_TOP;
import static android.app.AppOpsManager._NUM_UID_STATE;

import android.Manifest;
import android.app.ActivityManager;
import android.app.ActivityThread;
@@ -98,15 +107,6 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;

import static android.app.AppOpsManager._NUM_UID_STATE;
import static android.app.AppOpsManager.UID_STATE_BACKGROUND;
import static android.app.AppOpsManager.UID_STATE_CACHED;
import static android.app.AppOpsManager.UID_STATE_FOREGROUND;
import static android.app.AppOpsManager.UID_STATE_FOREGROUND_SERVICE;
import static android.app.AppOpsManager.UID_STATE_LAST_NON_RESTRICTED;
import static android.app.AppOpsManager.UID_STATE_PERSISTENT;
import static android.app.AppOpsManager.UID_STATE_TOP;

public class AppOpsService extends IAppOpsService.Stub {
    static final String TAG = "AppOps";
    static final boolean DEBUG = false;
@@ -1016,7 +1016,7 @@ public class AppOpsService extends IAppOpsService.Stub {
                    scheduleWriteLocked();
                }
            } else {
                if (uidState.opModes.get(code) == mode) {
                if (uidState.opModes.indexOfKey(code) >= 0 && uidState.opModes.get(code) == mode) {
                    return;
                }
                if (mode == defaultMode) {
@@ -1971,6 +1971,7 @@ public class AppOpsService extends IAppOpsService.Stub {
                            continue;
                        }
                        boolean doAllPackages = uidState.opModes != null
                                && uidState.opModes.indexOfKey(code) >= 0
                                && uidState.opModes.get(code) == AppOpsManager.MODE_FOREGROUND;
                        if (uidState.pkgOps != null) {
                            for (int pkgi = uidState.pkgOps.size() - 1; pkgi >= 0; pkgi--) {