# HG changeset patch # User mullan # Date 1222097177 14400 # Node ID b928fe1ab8667b775c5984ac73842a08ffcb758c # Parent 43c762ac4fdd42f091a3d68e97adfabf426f290c# Parent e8d6cef361995ec6f121f6feccdfc9f957415712 Merge diff -r e8d6cef36199 -r b928fe1ab866 jdk/src/share/classes/java/net/AbstractPlainSocketImpl.java --- a/jdk/src/share/classes/java/net/AbstractPlainSocketImpl.java Mon Sep 22 10:43:17 2008 -0400 +++ b/jdk/src/share/classes/java/net/AbstractPlainSocketImpl.java Mon Sep 22 11:26:17 2008 -0400 @@ -308,6 +308,12 @@ FileDescriptor fd = acquireFD(); try { socketConnect(address, port, timeout); + /* socket may have been closed during poll/select */ + synchronized (fdLock) { + if (closePending) { + throw new SocketException ("Socket closed"); + } + } // If we have a ref. to the Socket, then sets the flags // created, bound & connected to true. // This is normally done in Socket.connect() but some diff -r e8d6cef36199 -r b928fe1ab866 jdk/src/solaris/native/java/net/PlainSocketImpl.c --- a/jdk/src/solaris/native/java/net/PlainSocketImpl.c Mon Sep 22 10:43:17 2008 -0400 +++ b/jdk/src/solaris/native/java/net/PlainSocketImpl.c Mon Sep 22 11:26:17 2008 -0400 @@ -491,27 +491,6 @@ return; } - /* - * The socket may have been closed (dup'ed) while we were - * poll/select. In that case SO_ERROR will return 0 making - * it appear that the connection has been established. - * To avoid any race conditions we therefore grab the - * fd lock, check if the socket has been closed, and - * set the various fields whilst holding the lock - */ - fdLock = (*env)->GetObjectField(env, this, psi_fdLockID); - (*env)->MonitorEnter(env, fdLock); - - if ((*env)->GetBooleanField(env, this, psi_closePendingID)) { - - /* release fdLock */ - (*env)->MonitorExit(env, fdLock); - - JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", - "Socket closed"); - return; - } - (*env)->SetIntField(env, fdObj, IO_fd_fdID, fd); /* set the remote peer address and port */ @@ -536,11 +515,6 @@ (*env)->SetIntField(env, this, psi_localportID, localport); } } - - /* - * Finally release fdLock - */ - (*env)->MonitorExit(env, fdLock); } /*