summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Atneya Nair <atneya@google.com> 2025-03-12 19:08:49 -0700
committer Atneya Nair <atneya@google.com> 2025-03-12 19:08:49 -0700
commit03e402ab41f66c460c3814956c800d22939b3737 (patch)
tree61b4b712002ce9c8a574b97c66120e228c29ffcb
parent7bc538dfd643a839e2c856363d98b3ddadb1a941 (diff)
[audio] Fix incorrect isolated owner for multiuser
The owning uid was used directly, rather than its app-id when querying into the package map. This led to early return and a failure to sync the isolated proc on devices where the HDS is not running in user 0. Test: atest AlwaysOnHotwordDetectorTest on multi-user Bug: 396040470 Flag: EXEMPT bugfix Change-Id: I10eff5e10e92570d2546c0435acbe4826363289a
-rw-r--r--services/core/java/com/android/server/audio/AudioServerPermissionProvider.java32
1 files changed, 23 insertions, 9 deletions
diff --git a/services/core/java/com/android/server/audio/AudioServerPermissionProvider.java b/services/core/java/com/android/server/audio/AudioServerPermissionProvider.java
index 7502664a9628..180ef855cfda 100644
--- a/services/core/java/com/android/server/audio/AudioServerPermissionProvider.java
+++ b/services/core/java/com/android/server/audio/AudioServerPermissionProvider.java
@@ -39,6 +39,7 @@ import android.os.Trace;
import android.os.UserHandle;
import android.util.ArraySet;
import android.util.IntArray;
+import android.util.Log;
import com.android.internal.annotations.GuardedBy;
import com.android.media.permission.INativePermissionController;
@@ -62,6 +63,8 @@ import java.util.stream.Collectors;
/** Responsible for synchronizing system server permission state to the native audioserver. */
public class AudioServerPermissionProvider {
+ static final String TAG = "AudioServerPermissionProvider";
+
static final String[] MONITORED_PERMS = new String[PermissionEnum.ENUM_SIZE];
static final byte[] HDS_PERMS = new byte[] {PermissionEnum.CAPTURE_AUDIO_HOTWORD,
@@ -219,10 +222,13 @@ public class AudioServerPermissionProvider {
public void setIsolatedServiceUid(int uid, int owningUid) {
synchronized (mLock) {
if (mHdsUid == uid) return;
- var packageNameSet = mPackageMap.get(owningUid);
- if (packageNameSet == null) return;
- var packageName = packageNameSet.iterator().next();
- onModifyPackageState(uid, packageName, /* isRemove= */ false);
+ var packageNameSet = mPackageMap.get(UserHandle.getAppId(owningUid));
+ if (packageNameSet != null) {
+ var packageName = packageNameSet.iterator().next();
+ onModifyPackageState(uid, packageName, /* isRemove= */ false);
+ } else {
+ Log.wtf(TAG, "setIsolatedService owning uid not found");
+ }
// permissions
mHdsUid = uid;
if (mDest == null) {
@@ -249,11 +255,19 @@ public class AudioServerPermissionProvider {
public void clearIsolatedServiceUid(int uid) {
synchronized (mLock) {
- if (mHdsUid != uid) return;
- var packageNameSet = mPackageMap.get(uid);
- if (packageNameSet == null) return;
- var packageName = packageNameSet.iterator().next();
- onModifyPackageState(uid, packageName, /* isRemove= */ true);
+ var packageNameSet = mPackageMap.get(UserHandle.getAppId(uid));
+ if (mHdsUid != uid) {
+ Log.wtf(TAG,
+ "Unexpected isolated service uid cleared: " + uid + packageNameSet
+ + ", expected " + mHdsUid);
+ return;
+ }
+ if (packageNameSet != null) {
+ var packageName = packageNameSet.iterator().next();
+ onModifyPackageState(uid, packageName, /* isRemove= */ true);
+ } else {
+ Log.wtf(TAG, "clearIsolatedService uid not found");
+ }
// permissions
if (mDest == null) {
mIsUpdateDeferred = true;