From 28bb16c36660777e7916cf5e6f72be55d85cdbd9 Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Thu, 30 Jul 2015 23:41:43 +0900 Subject: [PATCH] Add a null check to hasIPv4AddressOnInterface. Change-Id: Ie38505ec0a93f4060348d92db341c536b7d60ed0 --- core/java/android/net/LinkProperties.java | 3 ++- .../src/android/net/LinkPropertiesTest.java | 26 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/core/java/android/net/LinkProperties.java b/core/java/android/net/LinkProperties.java index c4de4a21e0..6bfa2a495b 100644 --- a/core/java/android/net/LinkProperties.java +++ b/core/java/android/net/LinkProperties.java @@ -667,7 +667,8 @@ public final class LinkProperties implements Parcelable { * @return {@code true} if there is an IPv4 address, {@code false} otherwise. */ private boolean hasIPv4AddressOnInterface(String iface) { - return (mIfaceName.equals(iface) && hasIPv4Address()) || + // mIfaceName can be null. + return (Objects.equals(iface, mIfaceName) && hasIPv4Address()) || (iface != null && mStackedLinks.containsKey(iface) && mStackedLinks.get(iface).hasIPv4Address()); } diff --git a/core/tests/coretests/src/android/net/LinkPropertiesTest.java b/core/tests/coretests/src/android/net/LinkPropertiesTest.java index 075ceaa66c..b6b4f4fa96 100644 --- a/core/tests/coretests/src/android/net/LinkPropertiesTest.java +++ b/core/tests/coretests/src/android/net/LinkPropertiesTest.java @@ -48,6 +48,11 @@ public class LinkPropertiesTest extends TestCase { private static LinkAddress LINKADDRV6 = new LinkAddress(ADDRV6, 128); private static LinkAddress LINKADDRV6LINKLOCAL = new LinkAddress("fe80::1/64"); + // TODO: replace all calls to NetworkUtils.numericToInetAddress with calls to this method. + private InetAddress Address(String addrString) { + return NetworkUtils.numericToInetAddress(addrString); + } + public void assertLinkPropertiesEqual(LinkProperties source, LinkProperties target) { // Check implementation of equals(), element by element. assertTrue(source.isIdenticalInterfaceName(target)); @@ -647,5 +652,26 @@ public class LinkPropertiesTest extends TestCase { assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope)); assertTrue(v6lp.isReachable(kOnLinkDns)); assertTrue(v6lp.isReachable(DNS6)); + + // Check isReachable on stacked links. This requires that the source IP address be assigned + // on the interface returned by the route lookup. + LinkProperties stacked = new LinkProperties(); + + // Can't add a stacked link without an interface name. + stacked.setInterfaceName("v4-test0"); + v6lp.addStackedLink(stacked); + + InetAddress stackedAddress = Address("192.0.0.4"); + LinkAddress stackedLinkAddress = new LinkAddress(stackedAddress, 32); + assertFalse(v6lp.isReachable(stackedAddress)); + stacked.addLinkAddress(stackedLinkAddress); + assertFalse(v6lp.isReachable(stackedAddress)); + stacked.addRoute(new RouteInfo(stackedLinkAddress)); + assertTrue(stacked.isReachable(stackedAddress)); + assertTrue(v6lp.isReachable(stackedAddress)); + + assertFalse(v6lp.isReachable(DNS1)); + stacked.addRoute(new RouteInfo((IpPrefix) null, stackedAddress)); + assertTrue(v6lp.isReachable(DNS1)); } }