Use package name, pid, uid to check permission of capturing hotword.
Package name will be cached in ModuleClient when attaching a client. It
will be used when querying permission of capturing hotword.
Test: test with logging.
Bug: 74078996
Bug: 122721589
Change-Id: Icd2911f5d331d243c9eb5d58003ce5525c70c81e
diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
index b2a2344..b8036bb 100644
--- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
+++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
@@ -385,7 +385,7 @@
return PERMISSION_DENIED;
}
- bool canCaptureHotword = captureHotwordAllowed(pid, uid);
+ bool canCaptureHotword = captureHotwordAllowed(opPackageName, pid, uid);
if ((attr->source == AUDIO_SOURCE_HOTWORD) && !canCaptureHotword) {
return BAD_VALUE;
}
diff --git a/services/soundtrigger/SoundTriggerHwService.cpp b/services/soundtrigger/SoundTriggerHwService.cpp
index f89683a..377d30b 100644
--- a/services/soundtrigger/SoundTriggerHwService.cpp
+++ b/services/soundtrigger/SoundTriggerHwService.cpp
@@ -82,11 +82,13 @@
}
}
-status_t SoundTriggerHwService::listModules(struct sound_trigger_module_descriptor *modules,
+status_t SoundTriggerHwService::listModules(const String16& opPackageName,
+ struct sound_trigger_module_descriptor *modules,
uint32_t *numModules)
{
ALOGV("listModules");
- if (!captureHotwordAllowed(IPCThreadState::self()->getCallingPid(),
+ if (!captureHotwordAllowed(opPackageName,
+ IPCThreadState::self()->getCallingPid(),
IPCThreadState::self()->getCallingUid())) {
return PERMISSION_DENIED;
}
@@ -103,12 +105,14 @@
return NO_ERROR;
}
-status_t SoundTriggerHwService::attach(const sound_trigger_module_handle_t handle,
+status_t SoundTriggerHwService::attach(const String16& opPackageName,
+ const sound_trigger_module_handle_t handle,
const sp<ISoundTriggerClient>& client,
sp<ISoundTrigger>& moduleInterface)
{
ALOGV("attach module %d", handle);
- if (!captureHotwordAllowed(IPCThreadState::self()->getCallingPid(),
+ if (!captureHotwordAllowed(opPackageName,
+ IPCThreadState::self()->getCallingPid(),
IPCThreadState::self()->getCallingUid())) {
return PERMISSION_DENIED;
}
@@ -124,7 +128,7 @@
}
sp<Module> module = mModules.valueAt(index);
- sp<ModuleClient> moduleClient = module->addClient(client);
+ sp<ModuleClient> moduleClient = module->addClient(client, opPackageName);
if (moduleClient == 0) {
return NO_INIT;
}
@@ -479,7 +483,8 @@
}
sp<SoundTriggerHwService::ModuleClient>
-SoundTriggerHwService::Module::addClient(const sp<ISoundTriggerClient>& client)
+SoundTriggerHwService::Module::addClient(const sp<ISoundTriggerClient>& client,
+ const String16& opPackageName)
{
AutoMutex lock(mLock);
sp<ModuleClient> moduleClient;
@@ -490,7 +495,7 @@
return moduleClient;
}
}
- moduleClient = new ModuleClient(this, client);
+ moduleClient = new ModuleClient(this, client, opPackageName);
ALOGV("addClient() client %p", moduleClient.get());
mModuleClients.add(moduleClient);
@@ -913,8 +918,9 @@
#define LOG_TAG "SoundTriggerHwService::ModuleClient"
SoundTriggerHwService::ModuleClient::ModuleClient(const sp<Module>& module,
- const sp<ISoundTriggerClient>& client)
- : mModule(module), mClient(client)
+ const sp<ISoundTriggerClient>& client,
+ const String16& opPackageName)
+ : mModule(module), mClient(client), mOpPackageName(opPackageName)
{
}
@@ -938,7 +944,8 @@
void SoundTriggerHwService::ModuleClient::detach() {
ALOGV("detach()");
- if (!captureHotwordAllowed(IPCThreadState::self()->getCallingPid(),
+ if (!captureHotwordAllowed(mOpPackageName,
+ IPCThreadState::self()->getCallingPid(),
IPCThreadState::self()->getCallingUid())) {
return;
}
@@ -962,7 +969,8 @@
sound_model_handle_t *handle)
{
ALOGV("loadSoundModel() handle");
- if (!captureHotwordAllowed(IPCThreadState::self()->getCallingPid(),
+ if (!captureHotwordAllowed(mOpPackageName,
+ IPCThreadState::self()->getCallingPid(),
IPCThreadState::self()->getCallingUid())) {
return PERMISSION_DENIED;
}
@@ -980,7 +988,8 @@
status_t SoundTriggerHwService::ModuleClient::unloadSoundModel(sound_model_handle_t handle)
{
ALOGV("unloadSoundModel() model handle %d", handle);
- if (!captureHotwordAllowed(IPCThreadState::self()->getCallingPid(),
+ if (!captureHotwordAllowed(mOpPackageName,
+ IPCThreadState::self()->getCallingPid(),
IPCThreadState::self()->getCallingUid())) {
return PERMISSION_DENIED;
}
@@ -996,7 +1005,8 @@
const sp<IMemory>& dataMemory)
{
ALOGV("startRecognition() model handle %d", handle);
- if (!captureHotwordAllowed(IPCThreadState::self()->getCallingPid(),
+ if (!captureHotwordAllowed(mOpPackageName,
+ IPCThreadState::self()->getCallingPid(),
IPCThreadState::self()->getCallingUid())) {
return PERMISSION_DENIED;
}
@@ -1014,7 +1024,8 @@
status_t SoundTriggerHwService::ModuleClient::stopRecognition(sound_model_handle_t handle)
{
ALOGV("stopRecognition() model handle %d", handle);
- if (!captureHotwordAllowed(IPCThreadState::self()->getCallingPid(),
+ if (!captureHotwordAllowed(mOpPackageName,
+ IPCThreadState::self()->getCallingPid(),
IPCThreadState::self()->getCallingUid())) {
return PERMISSION_DENIED;
}
@@ -1029,7 +1040,8 @@
status_t SoundTriggerHwService::ModuleClient::getModelState(sound_model_handle_t handle)
{
ALOGV("getModelState() model handle %d", handle);
- if (!captureHotwordAllowed(IPCThreadState::self()->getCallingPid(),
+ if (!captureHotwordAllowed(mOpPackageName,
+ IPCThreadState::self()->getCallingPid(),
IPCThreadState::self()->getCallingUid())) {
return PERMISSION_DENIED;
}
diff --git a/services/soundtrigger/SoundTriggerHwService.h b/services/soundtrigger/SoundTriggerHwService.h
index 4258ec0..43ad611 100644
--- a/services/soundtrigger/SoundTriggerHwService.h
+++ b/services/soundtrigger/SoundTriggerHwService.h
@@ -47,10 +47,12 @@
virtual ~SoundTriggerHwService();
// ISoundTriggerHwService
- virtual status_t listModules(struct sound_trigger_module_descriptor *modules,
+ virtual status_t listModules(const String16& opPackageName,
+ struct sound_trigger_module_descriptor *modules,
uint32_t *numModules);
- virtual status_t attach(const sound_trigger_module_handle_t handle,
+ virtual status_t attach(const String16& opPackageName,
+ const sound_trigger_module_handle_t handle,
const sp<ISoundTriggerClient>& client,
sp<ISoundTrigger>& module);
@@ -133,7 +135,8 @@
void setCaptureState_l(bool active);
- sp<ModuleClient> addClient(const sp<ISoundTriggerClient>& client);
+ sp<ModuleClient> addClient(const sp<ISoundTriggerClient>& client,
+ const String16& opPackageName);
void detach(const sp<ModuleClient>& moduleClient);
@@ -156,7 +159,8 @@
public:
ModuleClient(const sp<Module>& module,
- const sp<ISoundTriggerClient>& client);
+ const sp<ISoundTriggerClient>& client,
+ const String16& opPackageName);
virtual ~ModuleClient();
@@ -190,6 +194,7 @@
mutable Mutex mLock;
wp<Module> mModule;
sp<ISoundTriggerClient> mClient;
+ const String16 mOpPackageName;
}; // class ModuleClient
class CallbackThread : public Thread {