diff options
author | Remi NGUYEN VAN <reminv@google.com> | 2020-05-01 08:20:51 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2020-05-01 08:20:51 +0000 |
commit | 91ee1dfc52b36123e3ba2004e9e9d32a85fc478b (patch) | |
tree | c4ace7e3a2f54a5d43cc1cf960201b1285256880 /src/android/net/ip/IpReachabilityMonitor.java | |
parent | 0162c4fc80cb3316d010254371f36ef0bc10f02a (diff) | |
parent | a51a28854f1e325fd0b9c187ab42ab05c4b4d060 (diff) |
Fix potential exceptions in FdEventReader users am: a51a28854f
Change-Id: Ie1358a7b62ad5331adbeb2143de98d747e936d2b
Diffstat (limited to 'src/android/net/ip/IpReachabilityMonitor.java')
-rw-r--r-- | src/android/net/ip/IpReachabilityMonitor.java | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/android/net/ip/IpReachabilityMonitor.java b/src/android/net/ip/IpReachabilityMonitor.java index db928d6..2a0ca5d 100644 --- a/src/android/net/ip/IpReachabilityMonitor.java +++ b/src/android/net/ip/IpReachabilityMonitor.java @@ -341,7 +341,14 @@ public class IpReachabilityMonitor { // TODO: Consider using NeighborEvent#isValid() here; it's more // strict but may interact badly if other entries are somehow in // NUD_INCOMPLETE (say, during network attach). - if (entry.getValue().nudState != StructNdMsg.NUD_FAILED) continue; + final NeighborEvent val = entry.getValue(); + + // Find all the neighbors that have gone into FAILED state. + // Ignore entries for which we have never received an event. If there are neighbors + // that never respond to ARP/ND, the kernel will send several FAILED event, then + // an INCOMPLETE event, and then more FAILED events. The INCOMPLETE event will + // populate the map and the subsequent FAILED event will be processed. + if (val == null || val.nudState != StructNdMsg.NUD_FAILED) continue; ip = entry.getKey(); for (RouteInfo route : mLinkProperties.getRoutes()) { @@ -378,10 +385,12 @@ public class IpReachabilityMonitor { Log.d(TAG, "neighbour IPv4(v6): " + entry.getKey() + " neighbour state: " + StructNdMsg.stringForNudState(entry.getValue().nudState)); } - if (entry.getValue().nudState != StructNdMsg.NUD_REACHABLE) return; + final NeighborEvent val = entry.getValue(); + // If an entry is null, consider that probing for that neighbour has completed. + if (val == null || val.nudState != StructNdMsg.NUD_REACHABLE) return; } - // All neighbours in the watchlist are in REACHABLE state and connection is stable, + // Probing for all neighbours in the watchlist is complete and the connection is stable, // restore NUD probe parameters to steadystate value. In the case where neighbours // are responsive, this code will run before the wakelock expires. setNeighbourParametersForSteadyState(); |