OSDN Git Service

Careful process validation for unaware providers.
authorJeff Sharkey <jsharkey@android.com>
Wed, 25 May 2016 17:06:20 +0000 (11:06 -0600)
committerJeff Sharkey <jsharkey@android.com>
Thu, 26 May 2016 18:01:28 +0000 (12:01 -0600)
When unlocking a user, install any direct boot unaware providers into
processes that were started before unlock.  Mirror the conditional
logic used in all other provider locations.

Bug: 28708253
Change-Id: I2044558456d7f8e509374659f7c89abf01869cd9

services/core/java/com/android/server/am/ActivityManagerService.java

index a8a8553..45e76e5 100644 (file)
@@ -10170,6 +10170,7 @@ public final class ActivityManagerService extends ActivityManagerNative
             int N = providers.size();
             app.pubProviders.ensureCapacity(N + app.pubProviders.size());
             for (int i=0; i<N; i++) {
+                // TODO: keep logic in sync with installEncryptionUnawareProviders
                 ProviderInfo cpi =
                     (ProviderInfo)providers.get(i);
                 boolean singleton = isSingleton(cpi.processName, cpi.applicationInfo,
@@ -11150,12 +11151,18 @@ public final class ActivityManagerService extends ActivityManagerNative
                             final PackageInfo pkgInfo = AppGlobals.getPackageManager()
                                     .getPackageInfo(pkgName, matchFlags, userId);
                             if (pkgInfo != null && !ArrayUtils.isEmpty(pkgInfo.providers)) {
-                                for (ProviderInfo provInfo : pkgInfo.providers) {
-                                    if (Objects.equals(provInfo.processName, app.processName)) {
-                                        Log.v(TAG, "Installing " + provInfo);
-                                        app.thread.scheduleInstallProvider(provInfo);
+                                for (ProviderInfo pi : pkgInfo.providers) {
+                                    // TODO: keep in sync with generateApplicationProvidersLocked
+                                    final boolean processMatch = Objects.equals(pi.processName,
+                                            app.processName) || pi.multiprocess;
+                                    final boolean userMatch = isSingleton(pi.processName,
+                                            pi.applicationInfo, pi.name, pi.flags)
+                                                    ? (app.userId == UserHandle.USER_SYSTEM) : true;
+                                    if (processMatch && userMatch) {
+                                        Log.v(TAG, "Installing " + pi);
+                                        app.thread.scheduleInstallProvider(pi);
                                     } else {
-                                        Log.v(TAG, "Skipping " + provInfo);
+                                        Log.v(TAG, "Skipping " + pi);
                                     }
                                 }
                             }