ruby-changes:10616
From: shyouhei <ko1@a...>
Date: Mon, 9 Feb 2009 17:37:43 +0900 (JST)
Subject: [ruby-changes:10616] Ruby:r22173 (ruby_1_8_7): merge revision(s) 20189:
shyouhei 2009-02-09 17:35:46 +0900 (Mon, 09 Feb 2009) New Revision: 22173 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=22173 Log: merge revision(s) 20189: * win32/win32.c (rb_w32_accept): secure fd before accept because if error causes in securing, cannot restore the state of accepted socket. fixed [ruby-core:19728] Modified files: branches/ruby_1_8_7/ChangeLog branches/ruby_1_8_7/version.h branches/ruby_1_8_7/win32/win32.c Index: ruby_1_8_7/ChangeLog =================================================================== --- ruby_1_8_7/ChangeLog (revision 22172) +++ ruby_1_8_7/ChangeLog (revision 22173) @@ -1,3 +1,10 @@ +Mon Feb 9 17:35:38 2009 NAKAMURA Usaku <usa@r...> + + * win32/win32.c (rb_w32_accept): secure fd before accept because if + error causes in securing, cannot restore the state of accepted + socket. + fixed [ruby-core:19728] + Mon Feb 9 13:42:15 2009 NAKAMURA Usaku <usa@r...> * win32/win32.c (ifs_open_socket): should retry without proto_buffer Index: ruby_1_8_7/version.h =================================================================== --- ruby_1_8_7/version.h (revision 22172) +++ ruby_1_8_7/version.h (revision 22173) @@ -2,7 +2,7 @@ #define RUBY_RELEASE_DATE "2009-02-09" #define RUBY_VERSION_CODE 187 #define RUBY_RELEASE_CODE 20090209 -#define RUBY_PATCHLEVEL 110 +#define RUBY_PATCHLEVEL 111 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 8 Index: ruby_1_8_7/win32/win32.c =================================================================== --- ruby_1_8_7/win32/win32.c (revision 22172) +++ ruby_1_8_7/win32/win32.c (revision 22173) @@ -2376,21 +2376,32 @@ rb_w32_accept(int s, struct sockaddr *addr, int *addrlen) { SOCKET r; + int fd; if (!NtSocketsInitialized) { StartSockets(); } RUBY_CRITICAL({ - r = accept(TO_SOCKET(s), addr, addrlen); - if (r == INVALID_SOCKET) { - errno = map_errno(WSAGetLastError()); - s = -1; + HANDLE h = CreateFile("NUL", 0, 0, NULL, OPEN_ALWAYS, 0, NULL); + fd = rb_w32_open_osfhandle((long)h, O_RDWR|O_BINARY|O_NOINHERIT); + if (fd != -1) { + r = accept(TO_SOCKET(s), addr, addrlen); + if (r != INVALID_SOCKET) { + MTHREAD_ONLY(EnterCriticalSection(&(_pioinfo(fd)->lock))); + _set_osfhnd(fd, r); + MTHREAD_ONLY(LeaveCriticalSection(&_pioinfo(fd)->lock)); + CloseHandle(h); + } + else { + errno = map_errno(WSAGetLastError()); + close(fd); + fd = -1; + } } - else { - s = rb_w32_open_osfhandle(r, O_RDWR|O_BINARY); - } + else + CloseHandle(h); }); - return s; + return fd; } #undef bind -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/