summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--win32/win32.c4
2 files changed, 12 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index ab313225a7..a41e9232a4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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);