summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLorenzo Colitti <lorenzo@google.com>2020-05-04 13:27:37 +0900
committerLorenzo Colitti <lorenzo@google.com>2020-05-04 13:39:20 +0900
commitcf37ca43cbb6c7fe37f7854a26eb02c260598575 (patch)
tree466c11bc59d01cbeb0add8a0d8b9e6e52416868e /src
parenta47091526a93be34808727b5897c948dfaf5884c (diff)
Don't crash if the PREF64 expires when IpClient is stopped.
Currently the code does not cancel the PREF64 alarm when IpClient is stopped. If the alarm fires when IpClient has disconnected, it will call updatePref64 with a null prefix, which will crash. Ensure that the alarm is cancelled when IpClient is stopped. Bug: 153694684 Bug: 155559286 Test: new unit tests Change-Id: I397eb36c1a8ecf1324de33e720577fe2e4e07056
Diffstat (limited to 'src')
-rw-r--r--src/android/net/ip/IpClientLinkObserver.java17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/android/net/ip/IpClientLinkObserver.java b/src/android/net/ip/IpClientLinkObserver.java
index dc58e7b..ee7f18b 100644
--- a/src/android/net/ip/IpClientLinkObserver.java
+++ b/src/android/net/ip/IpClientLinkObserver.java
@@ -238,6 +238,7 @@ public class IpClientLinkObserver implements NetworkObserver {
// while interfaceDnsServerInfo() is being called, we'll end up with no DNS servers in
// mLinkProperties, as desired.
mDnsServerRepository = new DnsServerRepository(mConfig.minRdnssLifetime);
+ mNetlinkMonitor.clearAlarms();
mLinkProperties.clear();
mLinkProperties.setInterfaceName(mInterfaceName);
}
@@ -281,18 +282,27 @@ public class IpClientLinkObserver implements NetworkObserver {
mIfindex = ifindex;
}
+ void clearAlarms() {
+ cancelPref64Alarm();
+ }
+
private final AlarmManager.OnAlarmListener mExpirePref64Alarm = () -> {
+ // Ignore the alarm if cancelPref64Alarm has already been called.
+ //
// TODO: in the rare case where the alarm fires and posts the lambda to the handler
// thread while we are processing an RA that changes the lifetime of the same prefix,
// this code will run anyway even if the alarm is rescheduled or cancelled. If the
- // lifetime in the RA is zero this doesn't matter (we just harmlessly cancel the alarm
- // one extra time) but if the lifetime is nonzero then the prefix will be added and
- // immediately removed by this code.
+ // lifetime in the RA is zero this code will correctly do nothing, but if the lifetime
+ // is nonzero then the prefix will be added and immediately removed by this code.
+ if (mNat64PrefixExpiry == 0) return;
updatePref64(mShim.getNat64Prefix(mLinkProperties),
mNat64PrefixExpiry, mNat64PrefixExpiry);
};
private void cancelPref64Alarm() {
+ // Clear the expiry in case the alarm just fired and has not been processed yet.
+ if (mNat64PrefixExpiry == 0) return;
+ mNat64PrefixExpiry = 0;
mAlarmManager.cancel(mExpirePref64Alarm);
}
@@ -342,7 +352,6 @@ public class IpClientLinkObserver implements NetworkObserver {
schedulePref64Alarm();
} else {
mShim.setNat64Prefix(mLinkProperties, null);
- mNat64PrefixExpiry = 0;
cancelPref64Alarm();
}