Merge "Apply package visibility to AppWidgetManager#getInstalledProviders" into sc-dev

This commit is contained in:
Jackal Guo
2021-04-20 03:14:16 +00:00
committed by Android (Google) Code Review

View File

@@ -1589,6 +1589,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
public ParceledListSlice<AppWidgetProviderInfo> getInstalledProvidersForProfile(int categoryFilter, public ParceledListSlice<AppWidgetProviderInfo> getInstalledProvidersForProfile(int categoryFilter,
int profileId, String packageName) { int profileId, String packageName) {
final int userId = UserHandle.getCallingUserId(); final int userId = UserHandle.getCallingUserId();
final int callingUid = Binder.getCallingUid();
if (DEBUG) { if (DEBUG) {
Slog.i(TAG, "getInstalledProvidersForProfiles() " + userId); Slog.i(TAG, "getInstalledProvidersForProfiles() " + userId);
@@ -1601,7 +1602,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
synchronized (mLock) { synchronized (mLock) {
if (mSecurityPolicy.isCallerInstantAppLocked()) { if (mSecurityPolicy.isCallerInstantAppLocked()) {
Slog.w(TAG, "Instant uid " + Binder.getCallingUid() Slog.w(TAG, "Instant uid " + callingUid
+ " cannot access widget providers"); + " cannot access widget providers");
return ParceledListSlice.emptyList(); return ParceledListSlice.emptyList();
} }
@@ -1614,11 +1615,12 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
for (int i = 0; i < providerCount; i++) { for (int i = 0; i < providerCount; i++) {
Provider provider = mProviders.get(i); Provider provider = mProviders.get(i);
AppWidgetProviderInfo info = provider.getInfoLocked(mContext); AppWidgetProviderInfo info = provider.getInfoLocked(mContext);
final String providerPackageName = provider.id.componentName.getPackageName();
// Ignore an invalid provider, one not matching the filter, // Ignore an invalid provider, one not matching the filter,
// or one that isn't in the given package, if any. // or one that isn't in the given package, if any.
boolean inPackage = packageName == null boolean inPackage = packageName == null
|| provider.id.componentName.getPackageName().equals(packageName); || providerPackageName.equals(packageName);
if (provider.zombie || (info.widgetCategory & categoryFilter) == 0 || !inPackage) { if (provider.zombie || (info.widgetCategory & categoryFilter) == 0 || !inPackage) {
continue; continue;
} }
@@ -1627,7 +1629,9 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
final int providerProfileId = info.getProfile().getIdentifier(); final int providerProfileId = info.getProfile().getIdentifier();
if (providerProfileId == profileId if (providerProfileId == profileId
&& mSecurityPolicy.isProviderInCallerOrInProfileAndWhitelListed( && mSecurityPolicy.isProviderInCallerOrInProfileAndWhitelListed(
provider.id.componentName.getPackageName(), providerProfileId)) { providerPackageName, providerProfileId)
&& !mPackageManagerInternal.filterAppAccess(providerPackageName, callingUid,
userId)) {
result.add(cloneIfLocalBinder(info)); result.add(cloneIfLocalBinder(info));
} }
} }