diff options
author | Vinit Deshpande <vinitd@google.com> | 2015-06-29 11:21:54 -0700 |
---|---|---|
committer | Vinit Deshpande <vinitd@google.com> | 2015-06-29 11:59:26 -0700 |
commit | fb80c4e9859161ba3492b79f485b9e554177c8c1 (patch) | |
tree | b952d58f5c2e4d0ec778227ff16b282324328ba6 /service/java/com/android/server/wifi/WifiMonitor.java | |
parent | b334e6ca020be2b0dedf0ff2ad6cd4e698aa2900 (diff) | |
download | android_frameworks_opt_net_wifi-fb80c4e9859161ba3492b79f485b9e554177c8c1.tar.gz android_frameworks_opt_net_wifi-fb80c4e9859161ba3492b79f485b9e554177c8c1.tar.bz2 android_frameworks_opt_net_wifi-fb80c4e9859161ba3492b79f485b9e554177c8c1.zip |
Fix potential system crash beacuse of bad Wifi parsing
WifiMonitor may throw an exception on some malformed events
taking the entire system down. This change gauards against
such crash.
Bug: 17698782
Change-Id: Ib855419c5ed24ec174889185c4d0b450403778de
Diffstat (limited to 'service/java/com/android/server/wifi/WifiMonitor.java')
-rw-r--r-- | service/java/com/android/server/wifi/WifiMonitor.java | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/service/java/com/android/server/wifi/WifiMonitor.java b/service/java/com/android/server/wifi/WifiMonitor.java index c244d68fc..9758d5769 100644 --- a/service/java/com/android/server/wifi/WifiMonitor.java +++ b/service/java/com/android/server/wifi/WifiMonitor.java @@ -1109,14 +1109,34 @@ public class WifiMonitor { return err; } + WifiP2pDevice getWifiP2pDevice(String dataString) { + try { + WifiP2pDevice device = new WifiP2pDevice(dataString); + return device; + } catch (IllegalArgumentException e) { + return null; + } + } + + WifiP2pGroup getWifiP2pGroup(String dataString) { + try { + WifiP2pGroup group = new WifiP2pGroup(dataString); + return group; + } catch (IllegalArgumentException e) { + return null; + } + } + /** * Handle p2p events */ private void handleP2pEvents(String dataString) { if (dataString.startsWith(P2P_DEVICE_FOUND_STR)) { - mStateMachine.sendMessage(P2P_DEVICE_FOUND_EVENT, new WifiP2pDevice(dataString)); + WifiP2pDevice device = getWifiP2pDevice(dataString); + if (device != null) mStateMachine.sendMessage(P2P_DEVICE_FOUND_EVENT, device); } else if (dataString.startsWith(P2P_DEVICE_LOST_STR)) { - mStateMachine.sendMessage(P2P_DEVICE_LOST_EVENT, new WifiP2pDevice(dataString)); + WifiP2pDevice device = getWifiP2pDevice(dataString); + if (device != null) mStateMachine.sendMessage(P2P_DEVICE_LOST_EVENT, device); } else if (dataString.startsWith(P2P_FIND_STOPPED_STR)) { mStateMachine.sendMessage(P2P_FIND_STOPPED_EVENT); } else if (dataString.startsWith(P2P_GO_NEG_REQUEST_STR)) { @@ -1131,9 +1151,11 @@ public class WifiMonitor { } else if (dataString.startsWith(P2P_GROUP_FORMATION_FAILURE_STR)) { mStateMachine.sendMessage(P2P_GROUP_FORMATION_FAILURE_EVENT, p2pError(dataString)); } else if (dataString.startsWith(P2P_GROUP_STARTED_STR)) { - mStateMachine.sendMessage(P2P_GROUP_STARTED_EVENT, new WifiP2pGroup(dataString)); + WifiP2pGroup group = getWifiP2pGroup(dataString); + if (group != null) mStateMachine.sendMessage(P2P_GROUP_STARTED_EVENT, group); } else if (dataString.startsWith(P2P_GROUP_REMOVED_STR)) { - mStateMachine.sendMessage(P2P_GROUP_REMOVED_EVENT, new WifiP2pGroup(dataString)); + WifiP2pGroup group = getWifiP2pGroup(dataString); + if (group != null) mStateMachine.sendMessage(P2P_GROUP_REMOVED_EVENT, group); } else if (dataString.startsWith(P2P_INVITATION_RECEIVED_STR)) { mStateMachine.sendMessage(P2P_INVITATION_RECEIVED_EVENT, new WifiP2pGroup(dataString)); |