summaryrefslogtreecommitdiff
path: root/include/ruby/win32.h
diff options
context:
space:
mode:
authorshirosaki <shirosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-05-08 12:47:25 +0000
committershirosaki <shirosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-05-08 12:47:25 +0000
commit5ccee663e9150df0de86f8eaaebed079c7561186 (patch)
tree8477f16e57e17599013640fdda744a378678013e /include/ruby/win32.h
parent7e134cf71e2535b562cd2d81e3ff69cbe49d0ce0 (diff)
* include/ruby/win32.h (FD_SET): change function to macro.
To avoid buffer overflow when smaller FD_SETSISE is used in ext libraries. * win32/win32.c (rb_w32_fdset): this function is not used anymore. But we leave this for compatibility. * win32/win32.c (rb_w32_select_with_thread): fix SEGV when smaller FD_SETSISE is used in ext libraries. Dereference of fd_set pointer causes SEGV. * test/-ext-/win32/test_fd_setsize.rb(TestFdSetSize): add tests for above. * ext/-test-/win32/fd_setsize/depend: ditto. * ext/-test-/win32/fd_setsize/extconf.rb: ditto. * ext/-test-/win32/fd_setsize/fd_setsize.c: ditto. [ruby-core:44588] [Bug #6352] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35595 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'include/ruby/win32.h')
-rw-r--r--include/ruby/win32.h17
1 files changed, 16 insertions, 1 deletions
diff --git a/include/ruby/win32.h b/include/ruby/win32.h
index 1f96648..757d2f1 100644
--- a/include/ruby/win32.h
+++ b/include/ruby/win32.h
@@ -581,7 +581,22 @@ extern char *rb_w32_strerror(int);
#define O_NONBLOCK 1
#undef FD_SET
-#define FD_SET(f, s) rb_w32_fdset(f, s)
+#define FD_SET(fd, set) do {\
+ unsigned int i;\
+ SOCKET s = _get_osfhandle(fd);\
+\
+ for (i = 0; i < (set)->fd_count; i++) {\
+ if ((set)->fd_array[i] == s) {\
+ break;\
+ }\
+ }\
+ if (i == (set)->fd_count) {\
+ if ((set)->fd_count < FD_SETSIZE) {\
+ (set)->fd_array[i] = s;\
+ (set)->fd_count++;\
+ }\
+ }\
+} while(0)
#undef FD_CLR
#define FD_CLR(f, s) rb_w32_fdclr(f, s)