ruby-changes:23732
From: naruse <ko1@a...>
Date: Fri, 25 May 2012 10:41:11 +0900 (JST)
Subject: [ruby-changes:23732] naruse:r35783 (ruby_1_9_3): merge revision(s) 35595: [Backport #6446]
naruse 2012-05-25 10:40:58 +0900 (Fri, 25 May 2012) New Revision: 35783 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=35783 Log: merge revision(s) 35595: [Backport #6446] * 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] Added directories: branches/ruby_1_9_3/ext/-test-/win32/fd_setsize/ Added files: branches/ruby_1_9_3/test/-ext-/win32/test_fd_setsize.rb Modified files: branches/ruby_1_9_3/ChangeLog branches/ruby_1_9_3/include/ruby/win32.h branches/ruby_1_9_3/version.h branches/ruby_1_9_3/win32/win32.c Index: ruby_1_9_3/include/ruby/win32.h =================================================================== --- ruby_1_9_3/include/ruby/win32.h (revision 35782) +++ ruby_1_9_3/include/ruby/win32.h (revision 35783) @@ -574,7 +574,22 @@ #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) Index: ruby_1_9_3/ChangeLog =================================================================== --- ruby_1_9_3/ChangeLog (revision 35782) +++ ruby_1_9_3/ChangeLog (revision 35783) @@ -1,3 +1,24 @@ +Fri May 25 10:40:31 2012 Hiroshi Shirosaki <h.shirosaki@g...> + + * 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] + Fri May 25 10:38:06 2012 Nobuyoshi Nakada <nobu@r...> * io.c (io_strip_bom): check EOF. [Bug #6487][ruby-core:45203] Index: ruby_1_9_3/win32/win32.c =================================================================== --- ruby_1_9_3/win32/win32.c (revision 35782) +++ ruby_1_9_3/win32/win32.c (revision 35783) @@ -2316,25 +2316,10 @@ return -1; } -#undef FD_SET - void rb_w32_fdset(int fd, fd_set *set) { - unsigned int i; - SOCKET s = TO_SOCKET(fd); - - for (i = 0; i < set->fd_count; i++) { - if (set->fd_array[i] == s) { - return; - } - } - if (i == set->fd_count) { - if (set->fd_count < FD_SETSIZE) { - set->fd_array[i] = s; - set->fd_count++; - } - } + FD_SET(fd, set); } #undef FD_CLR @@ -2718,14 +2703,19 @@ fd_set orig_rd; fd_set orig_wr; fd_set orig_ex; - if (rd) orig_rd = *rd; - if (wr) orig_wr = *wr; - if (ex) orig_ex = *ex; + + FD_ZERO(&orig_rd); + FD_ZERO(&orig_wr); + FD_ZERO(&orig_ex); + + if (rd) copy_fd(&orig_rd, rd); + if (wr) copy_fd(&orig_wr, wr); + if (ex) copy_fd(&orig_ex, ex); r = do_select(nfds, rd, wr, ex, &zero); // polling if (r != 0) break; // signaled or error - if (rd) *rd = orig_rd; - if (wr) *wr = orig_wr; - if (ex) *ex = orig_ex; + if (rd) copy_fd(rd, &orig_rd); + if (wr) copy_fd(wr, &orig_wr); + if (ex) copy_fd(ex, &orig_ex); if (timeout) { struct timeval now; Index: ruby_1_9_3/ext/-test-/win32/fd_setsize/depend =================================================================== --- ruby_1_9_3/ext/-test-/win32/fd_setsize/depend (revision 0) +++ ruby_1_9_3/ext/-test-/win32/fd_setsize/depend (revision 35783) @@ -0,0 +1,2 @@ +fd_setsize.o: $(top_srcdir)/win32/win32.c \ + $(hdrdir)/ruby/ruby.h Property changes on: ruby_1_9_3/ext/-test-/win32/fd_setsize/depend ___________________________________________________________________ Added: svn:eol-style + LF Index: ruby_1_9_3/ext/-test-/win32/fd_setsize/fd_setsize.c =================================================================== --- ruby_1_9_3/ext/-test-/win32/fd_setsize/fd_setsize.c (revision 0) +++ ruby_1_9_3/ext/-test-/win32/fd_setsize/fd_setsize.c (revision 35783) @@ -0,0 +1,55 @@ +#undef FD_SETSIZE +/* redefine smaller size then default 64 */ +#define FD_SETSIZE 32 +#include <ruby.h> + +static VALUE +test_select(VALUE self) +{ + int sd = socket(AF_INET, SOCK_DGRAM, 0); + struct timeval zero; + fd_set read; + fd_set write; + fd_set error; + + zero.tv_sec = 0; + zero.tv_usec = 0; + + FD_ZERO(&read); + FD_ZERO(&write); + FD_ZERO(&error); + + FD_SET(sd, &read); + FD_SET(sd, &write); + FD_SET(sd, &error); + + select(sd+1, &read, &write, &error, &zero); + + return Qtrue; +} + +static VALUE +test_fdset(VALUE self) +{ + int i; + fd_set set; + + FD_ZERO(&set); + + for (i = 0; i < FD_SETSIZE * 2; i++) { + int sd = socket(AF_INET, SOCK_DGRAM, 0); + FD_SET(sd, &set); + if (set.fd_count > FD_SETSIZE) { + return Qfalse; + } + } + return Qtrue; +} + +void +Init_fd_setsize(void) +{ + VALUE m = rb_define_module_under(rb_define_module("Bug"), "Win32"); + rb_define_module_function(m, "test_select", test_select, 0); + rb_define_module_function(m, "test_fdset", test_fdset, 0); +} Property changes on: ruby_1_9_3/ext/-test-/win32/fd_setsize/fd_setsize.c ___________________________________________________________________ Added: svn:eol-style + LF Index: ruby_1_9_3/ext/-test-/win32/fd_setsize/extconf.rb =================================================================== --- ruby_1_9_3/ext/-test-/win32/fd_setsize/extconf.rb (revision 0) +++ ruby_1_9_3/ext/-test-/win32/fd_setsize/extconf.rb (revision 35783) @@ -0,0 +1,3 @@ +if $mingw or $mswin + create_makefile("-test-/win32/fd_setsize") +end Property changes on: ruby_1_9_3/ext/-test-/win32/fd_setsize/extconf.rb ___________________________________________________________________ Added: svn:eol-style + LF Index: ruby_1_9_3/version.h =================================================================== --- ruby_1_9_3/version.h (revision 35782) +++ ruby_1_9_3/version.h (revision 35783) @@ -1,5 +1,5 @@ #define RUBY_VERSION "1.9.3" -#define RUBY_PATCHLEVEL 228 +#define RUBY_PATCHLEVEL 229 #define RUBY_RELEASE_DATE "2012-05-25" #define RUBY_RELEASE_YEAR 2012 Index: ruby_1_9_3/test/-ext-/win32/test_fd_setsize.rb =================================================================== --- ruby_1_9_3/test/-ext-/win32/test_fd_setsize.rb (revision 0) +++ ruby_1_9_3/test/-ext-/win32/test_fd_setsize.rb (revision 35783) @@ -0,0 +1,25 @@ +require 'test/unit' +require_relative '../../ruby/envutil' + +module Bug + module Win32 + class TestFdSetSize < Test::Unit::TestCase + def test_select_with_unmatched_fd_setsize + bug6532 = '[ruby-core:44588]' + assert_in_out_err([], <<-INPUT, %w(:ok), [], bug6532) + require '-test-/win32/fd_setsize' + Bug::Win32.test_select + p :ok + INPUT + end + + def test_fdset_with_unmatched_fd_setsize + bug6532 = '[ruby-core:44588]' + assert_in_out_err([], <<-INPUT, %w(:ok), [], bug6532) + require '-test-/win32/fd_setsize' + p :ok if Bug::Win32.test_fdset + INPUT + end + end + end +end if /mswin|mingw/ =~ RUBY_PLATFORM Property changes on: ruby_1_9_3/test/-ext-/win32/test_fd_setsize.rb ___________________________________________________________________ Added: svn:eol-style + LF -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/