From 31c9cd197b2b1c352e0075239791ba7f0960ace8 Mon Sep 17 00:00:00 2001 From: Eugene Susla Date: Mon, 3 Dec 2018 15:41:31 -0800 Subject: [PATCH] Intersect requestedPermissions with that of current update's one Fixes: 120092266 Test: - install apk https://drive.google.com/file/d/1eh2mCz-0Ymm4TghOaf46ZHdn2-M8bm6i/view?usp=sharing - hardcode DefaultPermissionGrantPolicy to always run on reboot - adb reboot - ensure device bootloobs with an error from attached bug - apply fix - ensure device no longer bootloops - ensure no error in logcat Change-Id: If2387e963b63231b0b99a55fdb7e75187d07bd07 --- .../com/android/internal/util/ArrayUtils.java | 27 +++++++++++++++++++ .../DefaultPermissionGrantPolicy.java | 12 ++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/core/java/com/android/internal/util/ArrayUtils.java b/core/java/com/android/internal/util/ArrayUtils.java index 4b662670f5e73..f669e94c17795 100644 --- a/core/java/com/android/internal/util/ArrayUtils.java +++ b/core/java/com/android/internal/util/ArrayUtils.java @@ -32,6 +32,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.function.IntFunction; /** * ArrayUtils contains some methods that you can call to find out @@ -656,4 +657,30 @@ public class ArrayUtils { throw new ArrayIndexOutOfBoundsException("length=" + len + "; index=" + index); } } + + /** + * Returns an array with values from {@code val} minus {@code null} values + * + * @param arrayConstructor typically {@code T[]::new} e.g. {@code String[]::new} + */ + public static T[] filterNotNull(T[] val, IntFunction arrayConstructor) { + int nullCount = 0; + int size = size(val); + for (int i = 0; i < size; i++) { + if (val[i] == null) { + nullCount++; + } + } + if (nullCount == 0) { + return val; + } + T[] result = arrayConstructor.apply(size - nullCount); + int outIdx = 0; + for (int i = 0; i < size; i++) { + if (val[i] != null) { + result[outIdx++] = val[i]; + } + } + return result; + } } diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java index 68fe1d8a05f80..51619cf940a8b 100644 --- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java +++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java @@ -46,7 +46,6 @@ import android.os.Environment; import android.os.Handler; import android.os.Looper; import android.os.Message; -import android.os.SystemProperties; import android.os.UserHandle; import android.os.storage.StorageManager; import android.permission.PermissionManager; @@ -1059,6 +1058,17 @@ public final class DefaultPermissionGrantPolicy { return; } + // Intersect the requestedPermissions for a factory image with that of its current update + // in case the latter one removed a + String[] requestedByNonSystemPackage = getPackageInfo(pkg.packageName).requestedPermissions; + int size = requestedPermissions.length; + for (int i = 0; i < size; i++) { + if (!ArrayUtils.contains(requestedByNonSystemPackage, requestedPermissions[i])) { + requestedPermissions[i] = null; + } + } + requestedPermissions = ArrayUtils.filterNotNull(requestedPermissions, String[]::new); + PackageManager pm = mContext.getPackageManager(); final ArraySet permissions = new ArraySet<>(permissionsWithoutSplits); ApplicationInfo applicationInfo = pkg.applicationInfo;