diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | win32/win32.c | 4 |
2 files changed, 12 insertions, 0 deletions
@@ -1,3 +1,11 @@ +Sun Mar 30 23:39:26 2014 NAKAMURA Usaku <usa@ruby-lang.org> + + * win32/win32.c (rb_w32_accept, open_ifs_socket, socketpair_internal): + reset inherit flag of socket to avoid unintentional inheritance of + socket. note that the return value of SetHandleInformation() is not + verified intentionally because old Windows may return an error. + [Bug #9688] [ruby-core:61754] + Sat Mar 29 13:04:22 2014 Koichi Sasada <ko1@atdot.net> * gc.c (gc_before_sweep): cap `malloc_limit' to diff --git a/win32/win32.c b/win32/win32.c index fbfbc37683..98e420078c 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -3017,6 +3017,7 @@ rb_w32_accept(int s, struct sockaddr *addr, int *addrlen) if (fd != -1) { r = accept(TO_SOCKET(s), addr, addrlen); if (r != INVALID_SOCKET) { + SetHandleInformation((HANDLE)r, HANDLE_FLAG_INHERIT, 0); MTHREAD_ONLY(EnterCriticalSection(&(_pioinfo(fd)->lock))); _set_osfhnd(fd, r); MTHREAD_ONLY(LeaveCriticalSection(&_pioinfo(fd)->lock)); @@ -3557,6 +3558,8 @@ open_ifs_socket(int af, int type, int protocol) } if (out == INVALID_SOCKET) out = WSASocket(af, type, protocol, NULL, 0, 0); + if (out != INVALID_SOCKET) + SetHandleInformation((HANDLE)out, HANDLE_FLAG_INHERIT, 0); } free(proto_buffers); @@ -3790,6 +3793,7 @@ socketpair_internal(int af, int type, int protocol, SOCKET *sv) r = accept(svr, addr, &len); if (r == INVALID_SOCKET) break; + SetHandleInformation((HANDLE)r, HANDLE_FLAG_INHERIT, 0); ret = 0; } while (0); |