summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNick Kralevich <nnk@google.com>2013-04-04 14:38:13 -0700
committerNick Kralevich <nnk@google.com>2013-04-04 17:12:00 -0700
commit73f2d3c79e57cac58fa0499accb1fb1192b7103f (patch)
tree4c08156da971fb45f29714315cee7a031b24d986
parent5a78b1b20d1f137f867bd1dba76377a41af1af18 (diff)
downloadframeworks_base-73f2d3c79e57cac58fa0499accb1fb1192b7103f.zip
frameworks_base-73f2d3c79e57cac58fa0499accb1fb1192b7103f.tar.gz
frameworks_base-73f2d3c79e57cac58fa0499accb1fb1192b7103f.tar.bz2
Error on conflicting <uses-permission>
Don't install packages where we have multiple, conflicting <uses-permission> lines for the same permission. For example, a package which contains: <uses-permission android:name="android.permission.INTERNET" android:required="false" /> <uses-permission android:name="android.permission.INTERNET" android:required="true" /> will now fail to install. In addition, this change slightly refactors the code, and creates a new parseUsesPermission() method. Change-Id: I0f4bb8b51dc4a0c5b73458a70f706e19829275d2
-rw-r--r--core/java/android/content/pm/PackageParser.java52
1 files changed, 35 insertions, 17 deletions
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 49cea3a..384aed8 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -1036,25 +1036,10 @@ public class PackageParser {
return null;
}
} else if (tagName.equals("uses-permission")) {
- sa = res.obtainAttributes(attrs,
- com.android.internal.R.styleable.AndroidManifestUsesPermission);
-
- // Note: don't allow this value to be a reference to a resource
- // that may change.
- String name = sa.getNonResourceString(
- com.android.internal.R.styleable.AndroidManifestUsesPermission_name);
- boolean required = sa.getBoolean(
- com.android.internal.R.styleable.AndroidManifestUsesPermission_required, true);
-
- sa.recycle();
-
- if (name != null && !pkg.requestedPermissions.contains(name)) {
- pkg.requestedPermissions.add(name.intern());
- pkg.requestedPermissionsRequired.add(required ? Boolean.TRUE : Boolean.FALSE);
+ if (!parseUsesPermission(pkg, res, parser, attrs, outError)) {
+ return null;
}
- XmlUtils.skipCurrentTag(parser);
-
} else if (tagName.equals("uses-configuration")) {
ConfigurationInfo cPref = new ConfigurationInfo();
sa = res.obtainAttributes(attrs,
@@ -1412,6 +1397,39 @@ public class PackageParser {
return pkg;
}
+ private boolean parseUsesPermission(Package pkg, Resources res, XmlResourceParser parser,
+ AttributeSet attrs, String[] outError)
+ throws XmlPullParserException, IOException {
+ TypedArray sa = res.obtainAttributes(attrs,
+ com.android.internal.R.styleable.AndroidManifestUsesPermission);
+
+ // Note: don't allow this value to be a reference to a resource
+ // that may change.
+ String name = sa.getNonResourceString(
+ com.android.internal.R.styleable.AndroidManifestUsesPermission_name);
+ boolean required = sa.getBoolean(
+ com.android.internal.R.styleable.AndroidManifestUsesPermission_required, true);
+
+ sa.recycle();
+
+ if (name != null) {
+ int index = pkg.requestedPermissions.indexOf(name);
+ if (index == -1) {
+ pkg.requestedPermissions.add(name.intern());
+ pkg.requestedPermissionsRequired.add(required ? Boolean.TRUE : Boolean.FALSE);
+ } else {
+ if (pkg.requestedPermissionsRequired.get(index) != required) {
+ outError[0] = "conflicting <uses-permission> entries";
+ mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
+ return false;
+ }
+ }
+ }
+
+ XmlUtils.skipCurrentTag(parser);
+ return true;
+ }
+
private static String buildClassName(String pkg, CharSequence clsSeq,
String[] outError) {
if (clsSeq == null || clsSeq.length() <= 0) {