diff options
| author | 2019-10-10 20:28:35 +0000 | |
|---|---|---|
| committer | 2019-10-10 20:28:35 +0000 | |
| commit | fc2cbb96e9c6a5224c20cd8174007718833425cc (patch) | |
| tree | ad80fec5aba0dcd699bce179f3fcd98dfbfa51c0 | |
| parent | 9319ea66beb66e601b3420ae959e011bc6a1e7ad (diff) | |
| parent | 5863233a3d719a64e13b9b9ddf72a5ad31e2090f (diff) | |
Merge "Don't grant visibility based on non-exported components"
| -rw-r--r-- | services/core/java/com/android/server/pm/AppsFilter.java | 63 |
1 files changed, 44 insertions, 19 deletions
diff --git a/services/core/java/com/android/server/pm/AppsFilter.java b/services/core/java/com/android/server/pm/AppsFilter.java index eb2e31d32beb..05b61689fdcf 100644 --- a/services/core/java/com/android/server/pm/AppsFilter.java +++ b/services/core/java/com/android/server/pm/AppsFilter.java @@ -195,19 +195,19 @@ public class AppsFilter { return false; } for (Intent intent : querying.mQueriesIntents) { - if (matches(intent, potentialTarget.providers, potentialTarget.activities, - potentialTarget.services, potentialTarget.receivers)) { + if (matches(intent, potentialTarget)) { return true; } } return false; } - private static boolean matches(Intent intent, - ArrayList<PackageParser.Provider> providerList, - ArrayList<? extends Component<? extends IntentInfo>>... componentLists) { - for (int p = providerList.size() - 1; p >= 0; p--) { - PackageParser.Provider provider = providerList.get(p); + private static boolean matches(Intent intent, PackageParser.Package potentialTarget) { + for (int p = potentialTarget.providers.size() - 1; p >= 0; p--) { + PackageParser.Provider provider = potentialTarget.providers.get(p); + if (!provider.info.exported) { + continue; + } final ProviderInfo providerInfo = provider.info; final Uri data = intent.getData(); if ("content".equalsIgnoreCase(intent.getScheme()) @@ -216,19 +216,44 @@ public class AppsFilter { return true; } } + for (int s = potentialTarget.services.size() - 1; s >= 0; s--) { + PackageParser.Service service = potentialTarget.services.get(s); + if (!service.info.exported) { + continue; + } + if (matchesAnyFilter(intent, service)) { + return true; + } + } + for (int a = potentialTarget.activities.size() - 1; a >= 0; a--) { + PackageParser.Activity activity = potentialTarget.activities.get(a); + if (!activity.info.exported) { + continue; + } + if (matchesAnyFilter(intent, activity)) { + return true; + } + } + for (int r = potentialTarget.receivers.size() - 1; r >= 0; r--) { + PackageParser.Activity receiver = potentialTarget.receivers.get(r); + if (!receiver.info.exported) { + continue; + } + if (matchesAnyFilter(intent, receiver)) { + return true; + } + } + return false; + } - for (int l = componentLists.length - 1; l >= 0; l--) { - ArrayList<? extends Component<? extends IntentInfo>> components = componentLists[l]; - for (int c = components.size() - 1; c >= 0; c--) { - Component<? extends IntentInfo> component = components.get(c); - ArrayList<? extends IntentInfo> intents = component.intents; - for (int i = intents.size() - 1; i >= 0; i--) { - IntentFilter intentFilter = intents.get(i); - if (intentFilter.match(intent.getAction(), intent.getType(), intent.getScheme(), - intent.getData(), intent.getCategories(), "AppsFilter") > 0) { - return true; - } - } + private static boolean matchesAnyFilter( + Intent intent, Component<? extends IntentInfo> component) { + ArrayList<? extends IntentInfo> intents = component.intents; + for (int i = intents.size() - 1; i >= 0; i--) { + IntentFilter intentFilter = intents.get(i); + if (intentFilter.match(intent.getAction(), intent.getType(), intent.getScheme(), + intent.getData(), intent.getCategories(), "AppsFilter") > 0) { + return true; } } return false; |