mirror of
https://github.com/ruby/ruby.git
synced 2025-09-19 10:33:58 +02:00
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] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_3@35783 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
cb1a793510
commit
2b8e9ece0f
8 changed files with 135 additions and 24 deletions
|
@ -2316,25 +2316,10 @@ ioctl(int i, int u, ...)
|
|||
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 @@ rb_w32_select_with_thread(int nfds, fd_set *rd, fd_set *wr, fd_set *ex,
|
|||
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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue