src/java.base/share/classes/java/net/AbstractPlainSocketImpl.java
changeset 55375 96c7427456f9
parent 55226 ce8bab2c4185
child 55693 9a97b1393e72
--- a/src/java.base/share/classes/java/net/AbstractPlainSocketImpl.java	Thu Jun 13 12:22:28 2019 +0530
+++ b/src/java.base/share/classes/java/net/AbstractPlainSocketImpl.java	Thu Jun 13 09:10:51 2019 +0100
@@ -43,6 +43,7 @@
 import sun.net.PlatformSocketImpl;
 import sun.net.ResourceManager;
 import sun.net.ext.ExtendedSocketOptions;
+import sun.net.util.IPAddressUtil;
 import sun.net.util.SocketExceptions;
 
 /**
@@ -157,8 +158,12 @@
         boolean connected = false;
         try {
             InetAddress address = InetAddress.getByName(host);
+            // recording this.address as supplied by caller before calling connect
+            this.address = address;
             this.port = port;
-            this.address = address;
+            if (address.isLinkLocalAddress()) {
+                address = IPAddressUtil.toScopedAddress(address);
+            }
 
             connectToAddress(address, port, timeout);
             connected = true;
@@ -182,8 +187,12 @@
      * @param port the specified port
      */
     protected void connect(InetAddress address, int port) throws IOException {
+        // recording this.address as supplied by caller before calling connect
+        this.address = address;
         this.port = port;
-        this.address = address;
+        if (address.isLinkLocalAddress()) {
+            address = IPAddressUtil.toScopedAddress(address);
+        }
 
         try {
             connectToAddress(address, port, timeout);
@@ -215,10 +224,14 @@
             InetSocketAddress addr = (InetSocketAddress) address;
             if (addr.isUnresolved())
                 throw new UnknownHostException(addr.getHostName());
+            // recording this.address as supplied by caller before calling connect
+            InetAddress ia = addr.getAddress();
+            this.address = ia;
             this.port = addr.getPort();
-            this.address = addr.getAddress();
-
-            connectToAddress(this.address, port, timeout);
+            if (ia.isLinkLocalAddress()) {
+                ia = IPAddressUtil.toScopedAddress(ia);
+            }
+            connectToAddress(ia, port, timeout);
             connected = true;
         } finally {
             if (!connected) {
@@ -546,6 +559,9 @@
                 NetHooks.beforeTcpBind(fd, address, lport);
             }
         }
+        if (address.isLinkLocalAddress()) {
+            address = IPAddressUtil.toScopedAddress(address);
+        }
         socketBind(address, lport);
         isBound = true;
     }