From bbf76ec06cbb846464bbb3701280167d0319b47b Mon Sep 17 00:00:00 2001 From: Mohan Embar Date: Fri, 7 Nov 2003 03:13:56 +0000 Subject: [PATCH] win32.h (_Jv_platform_close_on_exec): Changed signature and declared extern. * include/win32.h (_Jv_platform_close_on_exec): Changed signature and declared extern. * win32.cc (_Jv_platform_close_on_exec): Implemented. * gnu/java/net/natPlainDatagramSocketImplWin32.cc (create): Use new signature of _Jv_platform_close_on_exec. * gnu/java/net/natPlainSocketImplWin32.cc (create): Eliminated a few typecasts Use new signature of _Jv_platform_close_on_exec. (accept): Eliminated a few typecasts Use new signature of _Jv_platform_close_on_exec. * java/io/natFileDescriptorWin32.cc (open): Use _Jv_platform_close_on_exec. From-SVN: r73325 --- libjava/ChangeLog | 15 +++++++++++ .../net/natPlainDatagramSocketImplWin32.cc | 7 ++++-- .../gnu/java/net/natPlainSocketImplWin32.cc | 25 ++++++++++++------- libjava/include/win32.h | 7 ++---- libjava/java/io/natFileDescriptorWin32.cc | 8 +++++- libjava/win32.cc | 8 ++++++ 6 files changed, 53 insertions(+), 17 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 6cbae87531db..9b1af441622f 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,18 @@ +2003-11-06 Mohan Embar + + * include/win32.h (_Jv_platform_close_on_exec): Changed + signature and declared extern. + * win32.cc (_Jv_platform_close_on_exec): Implemented. + * gnu/java/net/natPlainDatagramSocketImplWin32.cc + (create): Use new signature of _Jv_platform_close_on_exec. + * gnu/java/net/natPlainSocketImplWin32.cc + (create): Eliminated a few typecasts + Use new signature of _Jv_platform_close_on_exec. + (accept): Eliminated a few typecasts + Use new signature of _Jv_platform_close_on_exec. + * java/io/natFileDescriptorWin32.cc (open): Use + _Jv_platform_close_on_exec. + 2003-11-04 Bryce McKinlay * java/lang/natClass.cc (newInstance): Throw InstantiationException diff --git a/libjava/gnu/java/net/natPlainDatagramSocketImplWin32.cc b/libjava/gnu/java/net/natPlainDatagramSocketImplWin32.cc index 1098e6158a8f..4a4ec986c612 100644 --- a/libjava/gnu/java/net/natPlainDatagramSocketImplWin32.cc +++ b/libjava/gnu/java/net/natPlainDatagramSocketImplWin32.cc @@ -69,11 +69,14 @@ gnu::java::net::PlainDatagramSocketImpl::create () _Jv_ThrowSocketException (); } - _Jv_platform_close_on_exec (sock); + // Cast this to a HANDLE so we can make + // it non-inheritable via _Jv_platform_close_on_exec. + HANDLE hSocket = (HANDLE) sock; + _Jv_platform_close_on_exec (hSocket); // We use native_fd in place of fd here. From leaving fd null we avoid // the double close problem in FileDescriptor.finalize. - native_fd = (int) sock; + native_fd = (jint) hSocket; } void diff --git a/libjava/gnu/java/net/natPlainSocketImplWin32.cc b/libjava/gnu/java/net/natPlainSocketImplWin32.cc index 96373811936a..c1c813ec7adc 100644 --- a/libjava/gnu/java/net/natPlainSocketImplWin32.cc +++ b/libjava/gnu/java/net/natPlainSocketImplWin32.cc @@ -45,18 +45,21 @@ union SockAddr void gnu::java::net::PlainSocketImpl::create (jboolean stream) { - int sock = ::socket (AF_INET, stream ? SOCK_STREAM : SOCK_DGRAM, 0); + SOCKET sock = ::socket (AF_INET, stream ? SOCK_STREAM : SOCK_DGRAM, 0); - if (sock == int(INVALID_SOCKET)) + if (sock == INVALID_SOCKET) { _Jv_ThrowIOException (); } - _Jv_platform_close_on_exec (sock); + // Cast this to a HANDLE so we can make + // it non-inheritable via _Jv_platform_close_on_exec. + HANDLE hSocket = (HANDLE) sock; + _Jv_platform_close_on_exec (hSocket); // We use native_fd in place of fd here. From leaving fd null we avoid // the double close problem in FileDescriptor.finalize. - native_fd = sock; + native_fd = (jint) hSocket; } void @@ -230,7 +233,8 @@ gnu::java::net::PlainSocketImpl::accept (gnu::java::net::PlainSocketImpl *s) { union SockAddr u; socklen_t addrlen = sizeof(u); - int new_socket = 0; + HANDLE hSocket = 0; + SOCKET new_socket = 0; if (timeout > 0) { @@ -245,7 +249,7 @@ gnu::java::net::PlainSocketImpl::accept (gnu::java::net::PlainSocketImpl *s) { new_socket = ::accept (native_fd, (sockaddr*) &u, &addrlen); - if (new_socket != int(INVALID_SOCKET)) + if (new_socket != INVALID_SOCKET) { // This new child socket is nonblocking because the parent // socket became nonblocking via the WSAEventSelect() call, @@ -284,10 +288,13 @@ gnu::java::net::PlainSocketImpl::accept (gnu::java::net::PlainSocketImpl *s) new_socket = ::accept (native_fd, (sockaddr*) &u, &addrlen); } - if (new_socket == int(INVALID_SOCKET)) + if (new_socket == INVALID_SOCKET) goto error; - _Jv_platform_close_on_exec (new_socket); + // Cast this to a HANDLE so we can make + // it non-inheritable via _Jv_platform_close_on_exec. + hSocket = (HANDLE) new_socket; + _Jv_platform_close_on_exec (hSocket); jbyteArray raddr; jint rport; @@ -308,7 +315,7 @@ gnu::java::net::PlainSocketImpl::accept (gnu::java::net::PlainSocketImpl *s) else throw new ::java::net::SocketException (JvNewStringUTF ("invalid family")); - s->native_fd = new_socket; + s->native_fd = (jint) hSocket; s->localport = localport; s->address = new ::java::net::InetAddress (raddr, NULL); s->port = rport; diff --git a/libjava/include/win32.h b/libjava/include/win32.h index e169adf9b284..479ed53f00ec 100644 --- a/libjava/include/win32.h +++ b/libjava/include/win32.h @@ -97,11 +97,8 @@ extern jlong _Jv_platform_gettimeofday (); extern int _Jv_select (int n, fd_set *, fd_set *, fd_set *, struct timeval *); extern int _Jv_pipe (int filedes[2]); -inline void -_Jv_platform_close_on_exec (jint) -{ - // Ignore. -} +extern void +_Jv_platform_close_on_exec (HANDLE h); #ifdef JV_HASH_SYNCHRONIZATION /* Suspends the execution of the current thread for the specified diff --git a/libjava/java/io/natFileDescriptorWin32.cc b/libjava/java/io/natFileDescriptorWin32.cc index 1891bf78e422..465d7557992e 100644 --- a/libjava/java/io/natFileDescriptorWin32.cc +++ b/libjava/java/io/natFileDescriptorWin32.cc @@ -133,7 +133,13 @@ java::io::FileDescriptor::open (jstring path, jint jflags) { throw new FileNotFoundException (_Jv_WinStrError (cpath, dwErrorCode)); } } - return (jint)handle; + + // Make this handle non-inheritable so that child + // processes don't inadvertently prevent us from + // closing this file. + _Jv_platform_close_on_exec (handle); + + return (jint) handle; } void diff --git a/libjava/win32.cc b/libjava/win32.cc index 3bf1391016e9..dfed8c436603 100644 --- a/libjava/win32.cc +++ b/libjava/win32.cc @@ -363,3 +363,11 @@ _Jv_pipe (int filedes[2]) { return _pipe (filedes, 4096, _O_BINARY); } + +void +_Jv_platform_close_on_exec (HANDLE h) +{ + // Mark the handle as non-inheritable. This has + // no effect under Win9X. + SetHandleInformation (h, HANDLE_FLAG_INHERIT, 0); +}