8201474: (so) Socket adaptor connect(InetAddress, timeout) succeeds when connection fails

Reviewed-by: bpb
This commit is contained in:
Alan Bateman 2018-04-14 08:41:42 +01:00
parent 85fbf32898
commit 45fb75c85a
5 changed files with 46 additions and 16 deletions

View File

@ -1280,8 +1280,8 @@ class DatagramChannelImpl
boolean polled = false;
try {
beginRead(blocking, false);
int n = Net.poll(fd, Net.POLLIN, timeout);
polled = (n > 0);
int events = Net.poll(fd, Net.POLLIN, timeout);
polled = (events != 0);
} finally {
endRead(blocking, polled);
}

View File

@ -431,8 +431,8 @@ class ServerSocketChannelImpl
boolean polled = false;
try {
begin(true);
int n = Net.poll(fd, Net.POLLIN, timeout);
polled = (n > 0);
int events = Net.poll(fd, Net.POLLIN, timeout);
polled = (events != 0);
} finally {
end(true, polled);
}

View File

@ -951,8 +951,8 @@ class SocketChannelImpl
boolean polled = false;
try {
beginRead(blocking);
int n = Net.poll(fd, Net.POLLIN, timeout);
polled = (n > 0);
int events = Net.poll(fd, Net.POLLIN, timeout);
polled = (events != 0);
} finally {
endRead(blocking, polled);
}
@ -977,10 +977,13 @@ class SocketChannelImpl
boolean polled = false;
try {
beginFinishConnect(blocking);
int n = Net.poll(fd, Net.POLLCONN, timeout);
polled = (n > 0);
int events = Net.poll(fd, Net.POLLCONN, timeout);
polled = (events != 0);
} finally {
endFinishConnect(blocking, polled);
// invoke endFinishConnect with completed = false so that
// the state is not changed to ST_CONNECTED. The socket
// adaptor will use finishConnect to finish.
endFinishConnect(blocking, /*completed*/false);
}
return polled;
} finally {

View File

@ -700,7 +700,8 @@ Java_sun_nio_ch_Net_poll(JNIEnv* env, jclass this, jobject fdo, jint events, jlo
if (rv >= 0) {
return pfd.revents;
} else if (errno == EINTR) {
return IOS_INTERRUPTED;
// interrupted, no events to return
return 0;
} else {
handleSocketError(env, errno);
return IOS_THROWN;

View File

@ -22,7 +22,7 @@
*/
/* @test
* @bug 8156002
* @bug 8156002 8201474
* @summary Unit test for socket-channel adaptors
* @library .. /test/lib
* @build jdk.test.lib.Utils TestServers
@ -37,18 +37,16 @@ import java.util.Arrays;
public class AdaptSocket {
static java.io.PrintStream out = System.out;
static final java.io.PrintStream out = System.out;
static void test(TestServers.DayTimeServer dayTimeServer,
static void test(TestServers.AbstractServer server,
int timeout,
boolean shouldTimeout)
throws Exception
{
out.println();
InetSocketAddress isa
= new InetSocketAddress(dayTimeServer.getAddress(),
dayTimeServer.getPort());
InetSocketAddress isa = new InetSocketAddress(server.getAddress(), server.getPort());
SocketChannel sc = SocketChannel.open();
Socket so = sc.socket();
out.println("opened: " + so);
@ -151,6 +149,30 @@ public class AdaptSocket {
sc.close();
}
static void testConnect(TestServers.AbstractServer server,
int timeout,
boolean shouldFail)
throws Exception
{
SocketAddress sa = new InetSocketAddress(server.getAddress(), server.getPort());
try (SocketChannel sc = SocketChannel.open()) {
Socket s = sc.socket();
try {
if (timeout > 0) {
s.connect(sa, timeout);
} else {
s.connect(sa);
}
if (shouldFail)
throw new Exception("Connection should not be established");
} catch (SocketException se) {
if (!shouldFail)
throw se;
out.println("connect failed as expected: " + se);
}
}
}
public static void main(String[] args) throws Exception {
try (TestServers.DayTimeServer dayTimeServer
@ -177,5 +199,9 @@ public class AdaptSocket {
= TestServers.NoResponseServer.startNewServer()) {
testRead(noResponseServer, 10, true);
}
TestServers.RefusingServer refuser = TestServers.RefusingServer.newRefusingServer();
testConnect(refuser, 0, true);
testConnect(refuser, 2000, true);
}
}