--- 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;
}