diff options
author | Randy Pan <zpan@google.com> | 2017-05-02 14:52:40 -0700 |
---|---|---|
committer | Randy Pan <zpan@google.com> | 2017-05-04 14:58:45 -0700 |
commit | 098640f533f3fc04cb49cb860f9dc45ad8a19e69 (patch) | |
tree | 37e47cba1bad8bac4667570336cf2930aad5324f /service | |
parent | 5213be94c3b27fff928f5f221e5951c7ede1058b (diff) |
Fix how WifiMonitor/WifiP2pMonitor sends a message
A message can potentially have multiple handlers. Looper recycles
the message after one handler is done with it. Sending/copying the
recycled message to another handler is problematic. Fix the issue
by always sending a copy of the original message.
Bug: 37714369
Test: runtest.sh
Change-Id: I2f4a4903ac8da94816341def969878f888154b6c
Diffstat (limited to 'service')
-rw-r--r-- | service/java/com/android/server/wifi/WifiMonitor.java | 20 | ||||
-rw-r--r-- | service/java/com/android/server/wifi/p2p/WifiP2pMonitor.java | 20 |
2 files changed, 12 insertions, 28 deletions
diff --git a/service/java/com/android/server/wifi/WifiMonitor.java b/service/java/com/android/server/wifi/WifiMonitor.java index d1903a0de..385bfccaa 100644 --- a/service/java/com/android/server/wifi/WifiMonitor.java +++ b/service/java/com/android/server/wifi/WifiMonitor.java @@ -262,14 +262,10 @@ public class WifiMonitor { SparseArray<Set<Handler>> ifaceHandlers = mHandlerMap.get(iface); if (iface != null && ifaceHandlers != null) { if (isMonitoring(iface)) { - boolean firstHandler = true; Set<Handler> ifaceWhatHandlers = ifaceHandlers.get(message.what); if (ifaceWhatHandlers != null) { for (Handler handler : ifaceWhatHandlers) { - if (firstHandler) { - firstHandler = false; - sendMessage(handler, message); - } else { + if (handler != null) { sendMessage(handler, Message.obtain(message)); } } @@ -283,28 +279,24 @@ public class WifiMonitor { if (mVerboseLoggingEnabled) { Log.d(TAG, "Sending to all monitors because there's no matching iface"); } - boolean firstHandler = true; for (Map.Entry<String, SparseArray<Set<Handler>>> entry : mHandlerMap.entrySet()) { if (isMonitoring(entry.getKey())) { Set<Handler> ifaceWhatHandlers = entry.getValue().get(message.what); for (Handler handler : ifaceWhatHandlers) { - if (firstHandler) { - firstHandler = false; - sendMessage(handler, message); - } else { + if (handler != null) { sendMessage(handler, Message.obtain(message)); } } } } } + + message.recycle(); } private void sendMessage(Handler handler, Message message) { - if (handler != null) { - message.setTarget(handler); - message.sendToTarget(); - } + message.setTarget(handler); + message.sendToTarget(); } /** diff --git a/service/java/com/android/server/wifi/p2p/WifiP2pMonitor.java b/service/java/com/android/server/wifi/p2p/WifiP2pMonitor.java index 50fd9325f..0411f3073 100644 --- a/service/java/com/android/server/wifi/p2p/WifiP2pMonitor.java +++ b/service/java/com/android/server/wifi/p2p/WifiP2pMonitor.java @@ -240,14 +240,10 @@ public class WifiP2pMonitor { SparseArray<Set<Handler>> ifaceHandlers = mHandlerMap.get(iface); if (iface != null && ifaceHandlers != null) { if (isMonitoring(iface)) { - boolean firstHandler = true; Set<Handler> ifaceWhatHandlers = ifaceHandlers.get(message.what); if (ifaceWhatHandlers != null) { for (Handler handler : ifaceWhatHandlers) { - if (firstHandler) { - firstHandler = false; - sendMessage(handler, message); - } else { + if (handler != null) { sendMessage(handler, Message.obtain(message)); } } @@ -261,28 +257,24 @@ public class WifiP2pMonitor { if (mVerboseLoggingEnabled) { Log.d(TAG, "Sending to all monitors because there's no matching iface"); } - boolean firstHandler = true; for (Map.Entry<String, SparseArray<Set<Handler>>> entry : mHandlerMap.entrySet()) { if (isMonitoring(entry.getKey())) { Set<Handler> ifaceWhatHandlers = entry.getValue().get(message.what); for (Handler handler : ifaceWhatHandlers) { - if (firstHandler) { - firstHandler = false; - sendMessage(handler, message); - } else { + if (handler != null) { sendMessage(handler, Message.obtain(message)); } } } } } + + message.recycle(); } private void sendMessage(Handler handler, Message message) { - if (handler != null) { - message.setTarget(handler); - message.sendToTarget(); - } + message.setTarget(handler); + message.sendToTarget(); } /** |