diff options
author | 2024-05-23 13:41:19 +0800 | |
---|---|---|
committer | 2024-05-23 06:02:57 +0000 | |
commit | a46ffb23d418cccdf1efb7ebd9a3b1b38bf4b7d8 (patch) | |
tree | 89454e8a7b6bae1fe4ed242cf86851401e82b80e | |
parent | 8089347daf9365edc8d585c1dd1e63b5c885ef30 (diff) |
SystemSensorManager:fix CWE problem by add lock.
When receive the DYNAMIC_SENSOR_CHANGED broadcast,thread A will
call the updateDynamicSensorList method to traverse mDynamicSensorCallbacks
map. Meanwhile,thread B call the register/unregister the dynamicSensorCallback,
it may cause CWE.So we should add a lock to protect.
Test: OEM monkey test
Bug: 342282013
Change-Id: Ic380ae23ecdcb0f501e85b19db4fcabc275f17c5
-rw-r--r-- | core/java/android/hardware/SystemSensorManager.java | 52 |
1 files changed, 29 insertions, 23 deletions
diff --git a/core/java/android/hardware/SystemSensorManager.java b/core/java/android/hardware/SystemSensorManager.java index 40e03dbb8b34..327378097ac1 100644 --- a/core/java/android/hardware/SystemSensorManager.java +++ b/core/java/android/hardware/SystemSensorManager.java @@ -518,23 +518,25 @@ public class SystemSensorManager extends SensorManager { Handler mainHandler = new Handler(mContext.getMainLooper()); - for (Map.Entry<DynamicSensorCallback, Handler> entry : - mDynamicSensorCallbacks.entrySet()) { - final DynamicSensorCallback callback = entry.getKey(); - Handler handler = - entry.getValue() == null ? mainHandler : entry.getValue(); - - handler.post(new Runnable() { - @Override - public void run() { - for (Sensor s: addedList) { - callback.onDynamicSensorConnected(s); + synchronized (mDynamicSensorCallbacks) { + for (Map.Entry<DynamicSensorCallback, Handler> entry : + mDynamicSensorCallbacks.entrySet()) { + final DynamicSensorCallback callback = entry.getKey(); + Handler handler = + entry.getValue() == null ? mainHandler : entry.getValue(); + + handler.post(new Runnable() { + @Override + public void run() { + for (Sensor s: addedList) { + callback.onDynamicSensorConnected(s); + } + for (Sensor s: removedList) { + callback.onDynamicSensorDisconnected(s); + } } - for (Sensor s: removedList) { - callback.onDynamicSensorDisconnected(s); - } - } - }); + }); + } } for (Sensor s: removedList) { @@ -653,13 +655,15 @@ public class SystemSensorManager extends SensorManager { if (callback == null) { throw new IllegalArgumentException("callback cannot be null"); } - if (mDynamicSensorCallbacks.containsKey(callback)) { - // has been already registered, ignore - return; - } + synchronized (mDynamicSensorCallbacks) { + if (mDynamicSensorCallbacks.containsKey(callback)) { + // has been already registered, ignore + return; + } - setupDynamicSensorBroadcastReceiver(); - mDynamicSensorCallbacks.put(callback, handler); + setupDynamicSensorBroadcastReceiver(); + mDynamicSensorCallbacks.put(callback, handler); + } } /** @hide */ @@ -668,7 +672,9 @@ public class SystemSensorManager extends SensorManager { if (DEBUG_DYNAMIC_SENSOR) { Log.i(TAG, "Removing dynamic sensor listener"); } - mDynamicSensorCallbacks.remove(callback); + synchronized (mDynamicSensorCallbacks) { + mDynamicSensorCallbacks.remove(callback); + } } /* |