Fix appops callback leak
Test: dumpsys appops after track finish to verify listener clears
Bug: 376481063
Bug: 385535422
Flag: com.android.media.audio.hardening_impl
Change-Id: Id431726a669a31a65ff63a66c79aadd9c7701db8
diff --git a/media/libaudiopermission/AppOpsSession.cpp b/media/libaudiopermission/AppOpsSession.cpp
index 920a046..2461564 100644
--- a/media/libaudiopermission/AppOpsSession.cpp
+++ b/media/libaudiopermission/AppOpsSession.cpp
@@ -24,8 +24,10 @@
namespace android::media::permission {
-// params are unreliable at the moment
-void DefaultAppOpsFacade::OpMonitor::opChanged(int32_t, const String16&) {
+// Package name param is unreliable (can be empty), but we should only get valid events based on
+// how we register the listener.
+void DefaultAppOpsFacade::OpMonitor::opChanged(int32_t op, const String16&) {
+ if (mOps.attributedOp != op && mOps.additionalOp != op) return;
DefaultAppOpsFacade x{};
const auto allowed = x.checkAccess(mAttr, mOps);
std::lock_guard l_{mLock};
@@ -107,6 +109,9 @@
}
LOG_ALWAYS_FATAL_IF(monitor == nullptr, "Unexpected nullptr in cb map");
monitor->stopListening();
+ // Callbacks are stored via binder identity in AppOpsService, so unregistering the callback
+ // removes it regardless of how many calls to startWatchingMode occurred
+ AppOpsManager{}.stopWatchingMode(monitor);
}
} // namespace android::media::permission