mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
5ccee663e9
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
55 lines
1,020 B
C
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);
|
|
}
|