diff options
author | Roshan Pius <rpius@google.com> | 2018-05-10 14:49:33 -0700 |
---|---|---|
committer | Roshan Pius <rpius@google.com> | 2018-05-15 00:40:31 +0000 |
commit | f4b0992881304e897a039e41e17c8b8d48a031fd (patch) | |
tree | 33d9018ca121a0d9258243a931ffb8f6ead8153f /service | |
parent | 9d83a9f592ba146ddb328d0415e067504f221b96 (diff) |
SupplicantStaIfaceHal: Don't trigger onDeath for remote exception
When supplicant is abruptly killed, any ongoing hwbinder transactions
will raise remote exceptions. The handling of these remote exceptions
might happen before the death notification from hwservicemanager is
processed. To prevent multiple death notifications, don't trigger the
onDeath callback on remote exception handling. Remote exception handling
will just clear internal state and wait for the death notification from
the system to trigger the onDeath callback.
Remote exceptions encountered in the initialization path will still
trigger death notification because we may not get notified from the
service manager.
Bug: 79532177
Test: Unit tests
Test: Crash wpa_supplicant in a loop and ensure that only one death
notification is triggered per crash.
Change-Id: Ia2ca3722aef4c38041a456e8fb3bc9cc60b6241a
Diffstat (limited to 'service')
-rw-r--r-- | service/java/com/android/server/wifi/SupplicantStaIfaceHal.java | 21 |
1 files changed, 7 insertions, 14 deletions
diff --git a/service/java/com/android/server/wifi/SupplicantStaIfaceHal.java b/service/java/com/android/server/wifi/SupplicantStaIfaceHal.java index 08a953e6f..5bf44ce66 100644 --- a/service/java/com/android/server/wifi/SupplicantStaIfaceHal.java +++ b/service/java/com/android/server/wifi/SupplicantStaIfaceHal.java @@ -332,7 +332,7 @@ public class SupplicantStaIfaceHal { }); } catch (RemoteException e) { Log.e(TAG, "ISupplicant.listInterfaces exception: " + e); - supplicantServiceDiedHandler(ifaceName); + handleRemoteException(e, "listInterfaces"); return null; } if (supplicantIfaces.size() == 0) { @@ -353,7 +353,7 @@ public class SupplicantStaIfaceHal { }); } catch (RemoteException e) { Log.e(TAG, "ISupplicant.getInterface exception: " + e); - supplicantServiceDiedHandler(ifaceName); + handleRemoteException(e, "getInterface"); return null; } break; @@ -386,8 +386,8 @@ public class SupplicantStaIfaceHal { supplicantIface.value = iface; }); } catch (RemoteException e) { - Log.e(TAG, "ISupplicant.createInterface exception: " + e); - supplicantServiceDiedHandler(ifaceName); + Log.e(TAG, "ISupplicant.addInterface exception: " + e); + handleRemoteException(e, "addInterface"); return null; } return supplicantIface.value; @@ -438,7 +438,7 @@ public class SupplicantStaIfaceHal { } } catch (RemoteException e) { Log.e(TAG, "ISupplicant.removeInterface exception: " + e); - supplicantServiceDiedHandler(ifaceName); + handleRemoteException(e, "removeInterface"); return false; } return true; @@ -479,13 +479,6 @@ public class SupplicantStaIfaceHal { } } - private void supplicantServiceDiedHandler(@NonNull String ifaceName) { - synchronized (mLock) { - mWifiMonitor.broadcastSupplicantDisconnectionEvent(ifaceName); - supplicantServiceDiedHandler(); - } - } - private void supplicantServiceDiedHandler() { synchronized (mLock) { for (String ifaceName : mISupplicantStaIfaces.keySet()) { @@ -590,7 +583,7 @@ public class SupplicantStaIfaceHal { return (getSupplicantMockableV1_1() != null); } catch (RemoteException e) { Log.e(TAG, "ISupplicant.getService exception: " + e); - supplicantServiceDiedHandler(); + handleRemoteException(e, "getSupplicantMockable"); return false; } } @@ -2211,7 +2204,7 @@ public class SupplicantStaIfaceHal { private void handleRemoteException(RemoteException e, String methodStr) { synchronized (mLock) { - supplicantServiceDiedHandler(); + clearState(); Log.e(TAG, "ISupplicantStaIface." + methodStr + " failed with exception", e); } } |