diff options
| -rw-r--r-- | services/core/java/com/android/server/pm/permission/PermissionManagerService.java | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index b56e5c993ce5..c5f939a2a66e 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -64,6 +64,7 @@ import android.permission.IPermissionManager; import android.permission.PermissionCheckerManager; import android.permission.PermissionManager; import android.permission.PermissionManagerInternal; +import android.service.voice.VoiceInteractionManagerInternal; import android.util.ArrayMap; import android.util.Slog; import android.util.SparseArray; @@ -969,12 +970,13 @@ public class PermissionManagerService extends IPermissionManager.Stub { // the private data in your process; or by you explicitly calling to another // app passing the source, in which case you must trust the other side; - final int callingUid = Binder.getCallingUid(); - if (source.getUid() != callingUid && mContext.checkPermission( + final int callingUid = resolveUid(Binder.getCallingUid()); + final int sourceUid = resolveUid(source.getUid()); + if (sourceUid != callingUid && mContext.checkPermission( Manifest.permission.UPDATE_APP_OPS_STATS, /*pid*/ -1, callingUid) != PackageManager.PERMISSION_GRANTED) { throw new SecurityException("Cannot register attribution source for uid:" - + source.getUid() + " from uid:" + callingUid); + + sourceUid + " from uid:" + callingUid); } final PackageManagerInternal packageManagerInternal = LocalServices.getService( @@ -983,10 +985,10 @@ public class PermissionManagerService extends IPermissionManager.Stub { // TODO(b/234653108): Clean up this UID/package & cross-user check. // If calling from the system process, allow registering attribution for package from // any user - int userId = UserHandle.getUserId((callingUid == Process.SYSTEM_UID ? source.getUid() + int userId = UserHandle.getUserId((callingUid == Process.SYSTEM_UID ? sourceUid : callingUid)); if (packageManagerInternal.getPackageUid(source.getPackageName(), 0, userId) - != source.getUid()) { + != sourceUid) { throw new SecurityException("Cannot register attribution source for package:" + source.getPackageName() + " from uid:" + callingUid); } @@ -1012,6 +1014,21 @@ public class PermissionManagerService extends IPermissionManager.Stub { return false; } } + + private int resolveUid(int uid) { + final VoiceInteractionManagerInternal vimi = LocalServices + .getService(VoiceInteractionManagerInternal.class); + if (vimi == null) { + return uid; + } + final VoiceInteractionManagerInternal.HotwordDetectionServiceIdentity + hotwordDetectionServiceIdentity = vimi.getHotwordDetectionServiceIdentity(); + if (hotwordDetectionServiceIdentity != null + && uid == hotwordDetectionServiceIdentity.getIsolatedUid()) { + return hotwordDetectionServiceIdentity.getOwnerUid(); + } + return uid; + } } /** |