From c5a303f4a849fcf693e37242299d9f77db2f5e10 Mon Sep 17 00:00:00 2001 From: Jackal Guo Date: Fri, 16 Apr 2021 14:09:57 +0800 Subject: [PATCH] Apply package visibility to AppWidgetManager#getInstalledProviders Package visibility should be applied to #getInstalledProviders as what we did for similar APIs in PackageManager. Bug: 180104057 Test: atest AppEnumerationTests Change-Id: I50f471e6f71613e36cc1b137456a3ee0b23f6a38 --- .../android/server/appwidget/AppWidgetServiceImpl.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java index e251700498ee7..d922d2b06c890 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java @@ -1589,6 +1589,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku public ParceledListSlice getInstalledProvidersForProfile(int categoryFilter, int profileId, String packageName) { final int userId = UserHandle.getCallingUserId(); + final int callingUid = Binder.getCallingUid(); if (DEBUG) { Slog.i(TAG, "getInstalledProvidersForProfiles() " + userId); @@ -1601,7 +1602,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku synchronized (mLock) { if (mSecurityPolicy.isCallerInstantAppLocked()) { - Slog.w(TAG, "Instant uid " + Binder.getCallingUid() + Slog.w(TAG, "Instant uid " + callingUid + " cannot access widget providers"); return ParceledListSlice.emptyList(); } @@ -1614,11 +1615,12 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku for (int i = 0; i < providerCount; i++) { Provider provider = mProviders.get(i); AppWidgetProviderInfo info = provider.getInfoLocked(mContext); + final String providerPackageName = provider.id.componentName.getPackageName(); // Ignore an invalid provider, one not matching the filter, // or one that isn't in the given package, if any. boolean inPackage = packageName == null - || provider.id.componentName.getPackageName().equals(packageName); + || providerPackageName.equals(packageName); if (provider.zombie || (info.widgetCategory & categoryFilter) == 0 || !inPackage) { continue; } @@ -1627,7 +1629,9 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku final int providerProfileId = info.getProfile().getIdentifier(); if (providerProfileId == profileId && mSecurityPolicy.isProviderInCallerOrInProfileAndWhitelListed( - provider.id.componentName.getPackageName(), providerProfileId)) { + providerPackageName, providerProfileId) + && !mPackageManagerInternal.filterAppAccess(providerPackageName, callingUid, + userId)) { result.add(cloneIfLocalBinder(info)); } }