# HG changeset patch # User jccollet # Date 1214912339 -7200 # Node ID bbfb1e2369b2a2c5abdfafe8f916952b9b4db459 # Parent 7c3638e8ff31e50a23ff7cd857960da8a3f5b590 6656849: NullPointerException thrown while de-serializing IPV6 Address. Summary: Check for existence of interface name earlier in code Reviewed-by: michaelm diff -r 7c3638e8ff31 -r bbfb1e2369b2 jdk/src/share/classes/java/net/Inet6Address.java --- a/jdk/src/share/classes/java/net/Inet6Address.java Tue Jul 01 13:29:36 2008 +0200 +++ b/jdk/src/share/classes/java/net/Inet6Address.java Tue Jul 01 13:38:59 2008 +0200 @@ -25,12 +25,9 @@ package java.net; -import java.security.AccessController; import java.io.ObjectInputStream; import java.io.IOException; -import java.io.ObjectStreamException; import java.io.InvalidObjectException; -import sun.security.action.*; import java.util.Enumeration; /** @@ -358,13 +355,13 @@ } private int deriveNumericScope (NetworkInterface ifc) throws UnknownHostException { - Enumeration addresses = ifc.getInetAddresses(); + Enumeration addresses = ifc.getInetAddresses(); while (addresses.hasMoreElements()) { - InetAddress address = (InetAddress)addresses.nextElement(); - if (!(address instanceof Inet6Address)) { + InetAddress addr = addresses.nextElement(); + if (!(addr instanceof Inet6Address)) { continue; } - Inet6Address ia6_addr = (Inet6Address)address; + Inet6Address ia6_addr = (Inet6Address)addr; /* check if site or link local prefixes match */ if (!differentLocalAddressTypes(ia6_addr)){ /* type not the same, so carry on searching */ @@ -377,22 +374,22 @@ } private int deriveNumericScope (String ifname) throws UnknownHostException { - Enumeration en; + Enumeration en; try { en = NetworkInterface.getNetworkInterfaces(); } catch (SocketException e) { throw new UnknownHostException ("could not enumerate local network interfaces"); } while (en.hasMoreElements()) { - NetworkInterface ifc = (NetworkInterface)en.nextElement(); + NetworkInterface ifc = en.nextElement(); if (ifc.getName().equals (ifname)) { Enumeration addresses = ifc.getInetAddresses(); while (addresses.hasMoreElements()) { - InetAddress address = (InetAddress)addresses.nextElement(); - if (!(address instanceof Inet6Address)) { + InetAddress addr = (InetAddress)addresses.nextElement(); + if (!(addr instanceof Inet6Address)) { continue; } - Inet6Address ia6_addr = (Inet6Address)address; + Inet6Address ia6_addr = (Inet6Address)addr; /* check if site or link local prefixes match */ if (!differentLocalAddressTypes(ia6_addr)){ /* type not the same, so carry on searching */ @@ -420,21 +417,22 @@ if (ifname != null && !"".equals (ifname)) { try { scope_ifname = NetworkInterface.getByName(ifname); - try { - scope_id = deriveNumericScope (scope_ifname); - } catch (UnknownHostException e) { - // should not happen - assert false; + if (scope_ifname == null) { + /* the interface does not exist on this system, so we clear + * the scope information completely */ + scope_id_set = false; + scope_ifname_set = false; + scope_id = 0; + } else { + try { + scope_id = deriveNumericScope (scope_ifname); + } catch (UnknownHostException e) { + // should not happen + assert false; + } } } catch (SocketException e) {} - if (scope_ifname == null) { - /* the interface does not exist on this system, so we clear - * the scope information completely */ - scope_id_set = false; - scope_ifname_set = false; - scope_id = 0; - } } /* if ifname was not supplied, then the numeric info is used */ @@ -460,6 +458,7 @@ * an IP multicast address * @since JDK1.1 */ + @Override public boolean isMulticastAddress() { return ((ipaddress[0] & 0xff) == 0xff); } @@ -470,6 +469,7 @@ * a wildcard address. * @since 1.4 */ + @Override public boolean isAnyLocalAddress() { byte test = 0x00; for (int i = 0; i < INADDRSZ; i++) { @@ -485,6 +485,7 @@ * a loopback address; or false otherwise. * @since 1.4 */ + @Override public boolean isLoopbackAddress() { byte test = 0x00; for (int i = 0; i < 15; i++) { @@ -500,6 +501,7 @@ * a link local address; or false if address is not a link local unicast address. * @since 1.4 */ + @Override public boolean isLinkLocalAddress() { return ((ipaddress[0] & 0xff) == 0xfe && (ipaddress[1] & 0xc0) == 0x80); @@ -512,6 +514,7 @@ * a site local address; or false if address is not a site local unicast address. * @since 1.4 */ + @Override public boolean isSiteLocalAddress() { return ((ipaddress[0] & 0xff) == 0xfe && (ipaddress[1] & 0xc0) == 0xc0); @@ -525,6 +528,7 @@ * of global scope or it is not a multicast address * @since 1.4 */ + @Override public boolean isMCGlobal() { return ((ipaddress[0] & 0xff) == 0xff && (ipaddress[1] & 0x0f) == 0x0e); @@ -538,6 +542,7 @@ * of node-local scope or it is not a multicast address * @since 1.4 */ + @Override public boolean isMCNodeLocal() { return ((ipaddress[0] & 0xff) == 0xff && (ipaddress[1] & 0x0f) == 0x01); @@ -551,6 +556,7 @@ * of link-local scope or it is not a multicast address * @since 1.4 */ + @Override public boolean isMCLinkLocal() { return ((ipaddress[0] & 0xff) == 0xff && (ipaddress[1] & 0x0f) == 0x02); @@ -564,6 +570,7 @@ * of site-local scope or it is not a multicast address * @since 1.4 */ + @Override public boolean isMCSiteLocal() { return ((ipaddress[0] & 0xff) == 0xff && (ipaddress[1] & 0x0f) == 0x05); @@ -578,6 +585,7 @@ * or it is not a multicast address * @since 1.4 */ + @Override public boolean isMCOrgLocal() { return ((ipaddress[0] & 0xff) == 0xff && (ipaddress[1] & 0x0f) == 0x08); @@ -590,6 +598,7 @@ * * @return the raw IP address of this object. */ + @Override public byte[] getAddress() { return ipaddress.clone(); } @@ -624,6 +633,7 @@ * * @return the raw IP address in a string format. */ + @Override public String getHostAddress() { String s = numericToTextFormat(ipaddress); if (scope_ifname_set) { /* must check this first */ @@ -639,6 +649,7 @@ * * @return a hash code value for this IP address. */ + @Override public int hashCode() { if (ipaddress != null) { @@ -677,6 +688,7 @@ * false otherwise. * @see java.net.InetAddress#getAddress() */ + @Override public boolean equals(Object obj) { if (obj == null || !(obj instanceof Inet6Address)) diff -r 7c3638e8ff31 -r bbfb1e2369b2 jdk/test/java/net/Inet6Address/serialize/Readme.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/net/Inet6Address/serialize/Readme.txt Tue Jul 01 13:38:59 2008 +0200 @@ -0,0 +1,6 @@ +This test uses 2 binary data files that were each created by serializing an Inet6Address instance. +In both cases this has to do with the tricky issue of scopes in serialized addresses. + +serial1.4.2.ser: Was created by serializing an Inet6Address (::1) with J2SE 1.4.2 and is used to check for backward compatibility. + +serial-bge0.ser: Was created on a Sparc workstation because it has an uncommon interface name ('bge0') which is useful for the test. diff -r 7c3638e8ff31 -r bbfb1e2369b2 jdk/test/java/net/Inet6Address/serialize/Serialize.java --- a/jdk/test/java/net/Inet6Address/serialize/Serialize.java Tue Jul 01 13:29:36 2008 +0200 +++ b/jdk/test/java/net/Inet6Address/serialize/Serialize.java Tue Jul 01 13:38:59 2008 +0200 @@ -24,7 +24,9 @@ /** * @test * @bug 4921029 + * @bug 6656849 * @summary java.net.Inet6Address fails to be serialized with IPv6 support + * @summary NullPointerException thrown while de-serializing IPV6 Address. */ import java.net.*; @@ -76,11 +78,20 @@ System.out.println(nobj); - // create an address with an unlikely numeric scope_id - if (!test ((Inet6Address)InetAddress.getByName ("fe80::1%99"))) { - throw new RuntimeException ("test failed on fe80::1%99"); - } + // create an address with an unlikely numeric scope_id + if (!test ((Inet6Address)InetAddress.getByName ("fe80::1%99"))) { + throw new RuntimeException ("test failed on fe80::1%99"); + } + // Deserialize an Inet6 address with a named interface + file = new File (System.getProperty("test.src"), "serial-bge0.ser"); + ois = new ObjectInputStream(new FileInputStream(file)); + try { + nobj = (Inet6Address) ois.readObject(); + } catch (NullPointerException e) { + throw new RuntimeException("6656849 Not fixed: NullPointer when deserializing"); + } + System.out.println(nobj); System.out.println("All tests passed"); } @@ -97,8 +108,5 @@ } else { return false; } - - } - } diff -r 7c3638e8ff31 -r bbfb1e2369b2 jdk/test/java/net/Inet6Address/serialize/serial-bge0.ser Binary file jdk/test/java/net/Inet6Address/serialize/serial-bge0.ser has changed