summaryrefslogtreecommitdiff
path: root/core/java
diff options
context:
space:
mode:
authorJackal Guo <jackalguo@google.com>2022-01-06 01:53:45 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2022-01-06 01:53:45 +0000
commit2648ce4633bc8428f02d79532dc84c91c26a730d (patch)
tree99646f5e2499da21d194c1934001cad79085cf2a /core/java
parentf5f9c51c888836442b0f5096a137fe2562a6df14 (diff)
parent0033c65aa995484ea6aeaa983c1a227fd14b30a5 (diff)
Merge "Add enforcement for duplicate permissions"
Diffstat (limited to 'core/java')
-rw-r--r--core/java/android/content/pm/parsing/ParsingPackageUtils.java8
-rw-r--r--core/java/android/content/pm/parsing/component/ParsedPermissionUtils.java27
2 files changed, 35 insertions, 0 deletions
diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
index 16deaa05afce..f336672ffefa 100644
--- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java
+++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
@@ -21,6 +21,7 @@ import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
import static android.content.pm.PackageManager.INSTALL_FAILED_INVALID_APK;
import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_BAD_MANIFEST;
import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
+import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_NOT_APK;
import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_ONLY_COREAPP_ALLOWED;
import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_RESOURCES_ARSC_COMPRESSED;
@@ -934,6 +935,13 @@ public class ParsingPackageUtils {
);
}
+ if (ParsedPermissionUtils.declareDuplicatePermission(pkg)) {
+ return input.error(
+ INSTALL_PARSE_FAILED_MANIFEST_MALFORMED,
+ "Declare duplicate permissions with different protection levels."
+ );
+ }
+
convertCompatPermissions(pkg);
convertSplitPermissions(pkg);
diff --git a/core/java/android/content/pm/parsing/component/ParsedPermissionUtils.java b/core/java/android/content/pm/parsing/component/ParsedPermissionUtils.java
index 66e9d3ddca1f..86c8f02f9fd9 100644
--- a/core/java/android/content/pm/parsing/component/ParsedPermissionUtils.java
+++ b/core/java/android/content/pm/parsing/component/ParsedPermissionUtils.java
@@ -27,6 +27,7 @@ import android.content.pm.parsing.result.ParseResult;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.content.res.XmlResourceParser;
+import android.util.ArrayMap;
import android.util.Slog;
import com.android.internal.R;
@@ -34,6 +35,7 @@ import com.android.internal.R;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
+import java.util.List;
/** @hide */
public class ParsedPermissionUtils {
@@ -271,4 +273,29 @@ public class ParsedPermissionUtils {
}
return size;
}
+
+ /**
+ * @return {@code true} if the package declares duplicate permissions with different
+ * protection levels.
+ */
+ public static boolean declareDuplicatePermission(@NonNull ParsingPackage pkg) {
+ final List<ParsedPermission> permissions = pkg.getPermissions();
+ final int size = permissions.size();
+ if (size > 0) {
+ final ArrayMap<String, ParsedPermission> checkDuplicatePerm = new ArrayMap<>(size);
+ for (int i = 0; i < size; i++) {
+ final ParsedPermission parsedPermission = permissions.get(i);
+ final String name = parsedPermission.getName();
+ final ParsedPermission perm = checkDuplicatePerm.get(name);
+ // Since a permission tree is also added as a permission with normal protection
+ // level, we need to skip if the parsedPermission is a permission tree.
+ if (perm != null && !(perm.isTree() || parsedPermission.isTree())
+ && perm.getProtectionLevel() != parsedPermission.getProtectionLevel()) {
+ return true;
+ }
+ checkDuplicatePerm.put(name, parsedPermission);
+ }
+ }
+ return false;
+ }
}