Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8004675

Inet6Address.getHostAddress should use string scope identifier where available

    XMLWordPrintable

Details

    • Bug
    • Resolution: Fixed
    • P3
    • 8
    • 7u9, 8
    • core-libs
    • b69
    • x86
    • os_x
    • Verified

    Description

      J2SE Version (please include all output from java -version flag):
      java version "1.7.0_09"
      Java(TM) SE Runtime Environment (build 1.7.0_09-b05)
      Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode)


      Does this problem occur on J2SE 6ux or 7ux? Yes / No (pick one)
      6: probably
      7u9: yes
      7u12: yes


      Operating System Configuration Information (be specific):
      Darwin macbook-retina.speedport.ip 12.2.1 Darwin Kernel Version 12.2.1: Thu Oct 18 16:32:48 PDT 2012; root:xnu-2050.20.9~2/RELEASE_X86_64 x86_64


      Hardware Configuration Information (be specific):
      Macbook Pro Retina 15"


      Bug Description:

      scope_ifname_set field not set correctly.

      The problem occurs in two scenarios:
      1. When iterating over all InetAddresses returned by NetworkInterface class on OS X (not tested on Win nor Linux)
      2. When deserializing Inet6Address (bug in readObject() method)

      java.net.Inet6Address#readObject() does not set field scope_ifname_set on deserialization even if network interface name could be verified.

      Even though the field ifname is set, the field scope_ifname_set is not set to true, which prevents the interface name to be returned in getHostAddr().

      This is even true for all Inet6Addresses returned by java.net.NetworkInterface#getNetworkInterfaces on OS-X. Means: all Inet6Addresses have the field scope_ifname_set==false but the field ifname contains the correct interface name.
      Seems that the following line should be added before the current line #429 in java/net/Inet6Address.java :
      scope_ifname_set = true;
      so that the try-catch looks like:
                          try {
                              scope_id = deriveNumericScope (scope_ifname);
                              scope_ifname_set = true;
                          } catch (UnknownHostException e) {
                              // typically should not happen, but it may be that
                              // the machine being used for deserialization has
                              // the same interface name but without IPv6 configured.
                          }



      Steps to Reproduce (be specific):



      import java.net.Inet6Address;
      import java.net.InetAddress;
      import java.net.NetworkInterface;
      import java.net.SocketException;
      import java.util.Enumeration;

      public class Jdk7NoIfname {

          public static void main(String args[]) throws SocketException {
              for (Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces(); e.hasMoreElements(); ) {
                  NetworkInterface iface = e.nextElement();
                  for (Enumeration<InetAddress> iadrs = iface.getInetAddresses(); iadrs.hasMoreElements(); ) {
                      InetAddress iadr = iadrs.nextElement();
                      if (iadr instanceof Inet6Address) {
                          Inet6Address i6adr = (Inet6Address) iadr;
                          System.out.println(iadr);
                          System.out.println(" scoped iface: "+i6adr.getScopedInterface());
                      }
                  }
              }
          }
      }



      The output produces
      /fe80:0:0:0:426c:8fff:fe3a:ba79%6
        scoped iface: name:en2 (en2)
      /0:0:0:0:0:0:0:1
        scoped iface: null
      /fe80:0:0:0:0:0:0:1%1
        scoped iface: name:lo0 (lo0)

      But the output should look like this
      /fe80:0:0:0:426c:8fff:fe3a:ba79%en2
        scoped iface: name:en2 (en2)
      /0:0:0:0:0:0:0:1
        scoped iface: null
      /fe80:0:0:0:0:0:0:1%lo0
        scoped iface: name:lo0 (lo0)

      Attachments

        Issue Links

          Activity

            People

              chegar Chris Hegarty
              tyao Ting-Yun Ingrid Yao (Inactive)
              Votes:
              0 Vote for this issue
              Watchers:
              4 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: