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/soundtrigger/ISoundTriggerHwService.cpp b/soundtrigger/ISoundTriggerHwService.cpp
index d44f5cb..bd107b4 100644
--- a/soundtrigger/ISoundTriggerHwService.cpp
+++ b/soundtrigger/ISoundTriggerHwService.cpp
@@ -50,7 +50,8 @@
{
}
- 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)
{
if (numModules == NULL || (*numModules != 0 && modules == NULL)) {
@@ -58,6 +59,7 @@
}
Parcel data, reply;
data.writeInterfaceToken(ISoundTriggerHwService::getInterfaceDescriptor());
+ data.writeString16(opPackageName);
unsigned int numModulesReq = (modules == NULL) ? 0 : *numModules;
data.writeInt32(numModulesReq);
status_t status = remote()->transact(LIST_MODULES, data, &reply);
@@ -77,12 +79,14 @@
return status;
}
- 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)
{
Parcel data, reply;
data.writeInterfaceToken(ISoundTriggerHwService::getInterfaceDescriptor());
+ data.writeString16(opPackageName);
data.write(&handle, sizeof(sound_trigger_module_handle_t));
data.writeStrongBinder(IInterface::asBinder(client));
status_t status = remote()->transact(ATTACH, data, &reply);
@@ -120,6 +124,11 @@
switch(code) {
case LIST_MODULES: {
CHECK_INTERFACE(ISoundTriggerHwService, data, reply);
+ String16 opPackageName;
+ status_t status = data.readString16(&opPackageName);
+ if (status != NO_ERROR) {
+ return status;
+ }
unsigned int numModulesReq = data.readInt32();
if (numModulesReq > MAX_ITEMS_PER_LIST) {
numModulesReq = MAX_ITEMS_PER_LIST;
@@ -133,7 +142,7 @@
reply->writeInt32(0);
return NO_ERROR;
}
- status_t status = listModules(modules, &numModules);
+ status = listModules(opPackageName, modules, &numModules);
reply->writeInt32(status);
reply->writeInt32(numModules);
ALOGV("LIST_MODULES status %d got numModules %d", status, numModules);
@@ -151,12 +160,17 @@
case ATTACH: {
CHECK_INTERFACE(ISoundTriggerHwService, data, reply);
+ String16 opPackageName;
+ status_t status = data.readString16(&opPackageName);
+ if (status != NO_ERROR) {
+ return status;
+ }
sound_trigger_module_handle_t handle;
data.read(&handle, sizeof(sound_trigger_module_handle_t));
sp<ISoundTriggerClient> client =
interface_cast<ISoundTriggerClient>(data.readStrongBinder());
sp<ISoundTrigger> module;
- status_t status = attach(handle, client, module);
+ status = attach(opPackageName, handle, client, module);
reply->writeInt32(status);
if (module != 0) {
reply->writeInt32(1);
diff --git a/soundtrigger/SoundTrigger.cpp b/soundtrigger/SoundTrigger.cpp
index d1eb367..9708ea7 100644
--- a/soundtrigger/SoundTrigger.cpp
+++ b/soundtrigger/SoundTrigger.cpp
@@ -80,19 +80,21 @@
}
// Static methods
-status_t SoundTrigger::listModules(struct sound_trigger_module_descriptor *modules,
- uint32_t *numModules)
+status_t SoundTrigger::listModules(const String16& opPackageName,
+ struct sound_trigger_module_descriptor *modules,
+ uint32_t *numModules)
{
ALOGV("listModules()");
const sp<ISoundTriggerHwService> service = getSoundTriggerHwService();
if (service == 0) {
return NO_INIT;
}
- return service->listModules(modules, numModules);
+ return service->listModules(opPackageName, modules, numModules);
}
-sp<SoundTrigger> SoundTrigger::attach(const sound_trigger_module_handle_t module,
- const sp<SoundTriggerCallback>& callback)
+sp<SoundTrigger> SoundTrigger::attach(const String16& opPackageName,
+ const sound_trigger_module_handle_t module,
+ const sp<SoundTriggerCallback>& callback)
{
ALOGV("attach()");
sp<SoundTrigger> soundTrigger;
@@ -101,7 +103,8 @@
return soundTrigger;
}
soundTrigger = new SoundTrigger(module, callback);
- status_t status = service->attach(module, soundTrigger, soundTrigger->mISoundTrigger);
+ status_t status = service->attach(opPackageName, module, soundTrigger,
+ soundTrigger->mISoundTrigger);
if (status == NO_ERROR && soundTrigger->mISoundTrigger != 0) {
IInterface::asBinder(soundTrigger->mISoundTrigger)->linkToDeath(soundTrigger);