OSDN Git Service

Don't crash when preferred activity settings are malformed
authorChristopher Tate <ctate@google.com>
Wed, 30 Oct 2013 00:42:26 +0000 (17:42 -0700)
committerChristopher Tate <ctate@google.com>
Wed, 30 Oct 2013 00:42:26 +0000 (17:42 -0700)
We also now ignore attempts to set preferred resolutions with
intent filters for which no actions are defined.

Bug 11392870

Change-Id: If0d0b37bf01b59463985441edfc2bddd070bfc2a

services/java/com/android/server/pm/PackageManagerService.java

index a781d5f..3d6b3c9 100755 (executable)
@@ -9965,6 +9965,10 @@ public class PackageManagerService extends IPackageManager.Stub {
         // writer
         int callingUid = Binder.getCallingUid();
         enforceCrossUserPermission(callingUid, userId, true, "add preferred activity");
+        if (filter.countActions() == 0) {
+            Slog.w(TAG, "Cannot set a preferred activity with no filter actions");
+            return;
+        }
         synchronized (mPackages) {
             if (mContext.checkCallingOrSelfPermission(
                     android.Manifest.permission.SET_PREFERRED_APPLICATIONS)
@@ -10024,7 +10028,9 @@ public class PackageManagerService extends IPackageManager.Stub {
                 String category = filter.getCategory(0);
                 while (it.hasNext()) {
                     PreferredActivity pa = it.next();
-                    if (pa.getAction(0).equals(action) && pa.getCategory(0).equals(category)) {
+                    if ((pa.countActions() == 0) || (pa.countCategories() == 0)
+                            || (pa.getAction(0).equals(action)
+                                    && pa.getCategory(0).equals(category))) {
                         if (removed == null) {
                             removed = new ArrayList<PreferredActivity>();
                         }