1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/ext/-test-/win32/fd_setsize/fd_setsize.c
shirosaki 5ccee663e9 * 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
2012-05-08 12:47:25 +00:00

55 lines
1,020 B
C

#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);
}