From 92b367e0696785540143707af4093108d6d98c79 Mon Sep 17 00:00:00 2001 From: kosaki Date: Sat, 16 Mar 2013 05:07:28 +0000 Subject: * thread.c: disabled _FORTIFY_SOURCE for avoid to hit glibc bug. [Bug #8080] [ruby-core:53349] * test/ruby/test_io.rb (TestIO#test_io_select_with_many_files): test for the above. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39775 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 +++++++ test/ruby/test_io.rb | 27 ++++++++++++++++++++++++++- thread.c | 13 +++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 479082a420..18f7b5c39a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Fri Mar 15 14:57:16 2013 KOSAKI Motohiro + + * thread.c: disabled _FORTIFY_SOURCE for avoid to hit glibc bug. + [Bug #8080] [ruby-core:53349] + * test/ruby/test_io.rb (TestIO#test_io_select_with_many_files): + test for the above. + Wed Mar 13 15:16:35 2013 KOSAKI Motohiro * include/ruby/missing.h (__syscall): moved to... diff --git a/test/ruby/test_io.rb b/test/ruby/test_io.rb index 451f6c246d..c19b1608df 100644 --- a/test/ruby/test_io.rb +++ b/test/ruby/test_io.rb @@ -2629,5 +2629,30 @@ End s.puts(c.new) assert_equal("[...]\n", s.string, bug5986) end -end + def test_io_select_with_many_files + bug8080 = '[ruby-core:53349]' + + assert_normal_exit %q{ + require "tempfile" + + # try to raise RLIM_NOFILE to >FD_SETSIZE + # Unfortunately, ruby export FD_SETSIZE. then we assume it's 1024. + fd_setsize = 1024 + + begin + Process.setrlimit(Process::RLIMIT_NOFILE, fd_setsize+10) + rescue =>e + # Process::RLIMIT_NOFILE couldn't be raised. skip the test + exit 0 + end + + tempfiles = [] + (0..fd_setsize+1).map {|i| + tempfiles << Tempfile.open("test_io_select_with_many_files") + } + + IO.select(tempfiles) + }, bug8080 + end +end diff --git a/thread.c b/thread.c index ab3540b51b..955c5f9e5f 100644 --- a/thread.c +++ b/thread.c @@ -42,6 +42,19 @@ */ +/* + * FD_SET, FD_CLR and FD_ISSET have a small sanity check when using glibc + * 2.15 or later and set _FORTIFY_SOURCE > 0. + * However, the implementation is wrong. Even though Linux's select(2) + * support large fd size (>FD_SETSIZE), it wrongly assume fd is always + * less than FD_SETSIZE (i.e. 1024). And then when enabling HAVE_RB_FD_INIT, + * it doesn't work correctly and makes program abort. Therefore we need to + * disable FORTY_SOURCE until glibc fixes it. + */ +#undef _FORTIFY_SOURCE +#undef __USE_FORTIFY_LEVEL +#define __USE_FORTIFY_LEVEL 0 + /* for model 2 */ #include "eval_intern.h" -- cgit v1.2.3