diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index a7924e61cd3e4..6fda72e1267b4 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -3007,12 +3007,35 @@ public class WallpaperManagerService extends IWallpaperManager.Stub } } + private boolean packageBelongsToUid(String packageName, int uid) { + int userId = UserHandle.getUserId(uid); + int packageUid; + try { + packageUid = mContext.getPackageManager().getPackageUidAsUser( + packageName, userId); + } catch (PackageManager.NameNotFoundException e) { + return false; + } + return packageUid == uid; + } + + private void enforcePackageBelongsToUid(String packageName, int uid) { + if (!packageBelongsToUid(packageName, uid)) { + throw new IllegalArgumentException( + "Invalid package or package does not belong to uid:" + + uid); + } + } + /** * Certain user types do not support wallpapers (e.g. managed profiles). The check is * implemented through through the OP_WRITE_WALLPAPER AppOp. */ public boolean isWallpaperSupported(String callingPackage) { - return mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_WRITE_WALLPAPER, Binder.getCallingUid(), + final int callingUid = Binder.getCallingUid(); + enforcePackageBelongsToUid(callingPackage, callingUid); + + return mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_WRITE_WALLPAPER, callingUid, callingPackage) == AppOpsManager.MODE_ALLOWED; }