I have a program uses large numbers of file descriptors (over 1024), and it crashes miserably in __fortify_fail. Turning off FORTIFY_SOURCE/stack-protector results in a plain old segfault.
Reproducing with the attached program (crash-it.scm): Platform is GNU/Linux x86-64, gcc is 4.6.3. You need to set your ulimit over 1024 to trigger the crash (otherwise you'll just get "Too many open files" and rain of "integer expected" from the looping threads)
$ ulimit -n 4096 $ gsi crash-it.scm -e "(go 1500)" *** buffer overflow detected ***: gsi terminated ======= Backtrace: ========= /lib64/libc.so.6(__fortify_fail+0x37)[0x7fb775187dd7] /lib64/libc.so.6(+0xfdbe0)[0x7fb775185be0] /lib64/libc.so.6(+0xffd8e)[0x7fb775187d8e] /usr/local/gambit/current/lib/libgambc.so(___device_select_add_fd+0x55)[0x7fb775d625c5] /usr/local/gambit/current/lib/libgambc.so(+0x227a91)[0x7fb775d62a91] /usr/local/gambit/current/lib/libgambc.so(___device_select+0x104)[0x7fb775d62324] /usr/local/gambit/current/lib/libgambc.so(___os_condvar_select+0x141)[0x7fb775d64d61] /usr/local/gambit/current/lib/libgambc.so(+0x2310a1)[0x7fb775d6c0a1] /usr/local/gambit/current/lib/libgambc.so(___call+0xfa)[0x7fb775d4d2ba] /usr/local/gambit/current/lib/libgambc.so(___setup+0xfc0)[0x7fb775d4f760] /usr/local/gambit/current/lib/libgambc.so(___main+0x2a7)[0x7fb775d4bf57] /usr/local/gambit/current/lib/libgambc.so(___main_char+0xb0)[0x7fb775d59200] /lib64/libc.so.6(__libc_start_main+0xed)[0x7fb7750ac60d] gsi[0x403199]
Build config: ./configure --prefix=/usr/local/gambit --enable-single-host --enable-c-opt --enable-gcc-opts --enable-multiple-versions --enable-shared
To build without fortifications: ./configure CFLAGS="-U_FORTIFY_SOURCE -fno-stack-protector" ... And you'll get a segfault.
-- vyzo
Afficher les réponses par date
I guess this shouldn't be too big a surprise given this definition: /usr/include/bits/typesizes.h:#define __FD_SETSIZE 1024
/usr/include/sys/select.h: typedef struct { #ifdef __USE_XOPEN __fd_mask fds_bits[__FD_SETSIZE / __NFDBITS]; # define __FDS_BITS(set) ((set)->fds_bits) #else __fd_mask __fds_bits[__FD_SETSIZE / __NFDBITS]; # define __FDS_BITS(set) ((set)->__fds_bits) #endif } fd_set;
#define __NFDBITS (8 * (int) sizeof (__fd_mask))
So great. Gambit can't do more than 1024 file descriptors, unless the scheduler is fixed to use poll instead of select.
-- vyzo
On Sun, Mar 24, 2013 at 10:45 PM, Dimitris Vyzovitis vyzo@hackzen.org wrote:
I have a program uses large numbers of file descriptors (over 1024), and it crashes miserably in __fortify_fail. Turning off FORTIFY_SOURCE/stack-protector results in a plain old segfault.
Reproducing with the attached program (crash-it.scm): Platform is GNU/Linux x86-64, gcc is 4.6.3. You need to set your ulimit over 1024 to trigger the crash (otherwise you'll just get "Too many open files" and rain of "integer expected" from the looping threads)
$ ulimit -n 4096 $ gsi crash-it.scm -e "(go 1500)" *** buffer overflow detected ***: gsi terminated ======= Backtrace: ========= /lib64/libc.so.6(__fortify_fail+0x37)[0x7fb775187dd7] /lib64/libc.so.6(+0xfdbe0)[0x7fb775185be0] /lib64/libc.so.6(+0xffd8e)[0x7fb775187d8e] /usr/local/gambit/current/lib/libgambc.so(___device_select_add_fd+0x55)[0x7fb775d625c5] /usr/local/gambit/current/lib/libgambc.so(+0x227a91)[0x7fb775d62a91] /usr/local/gambit/current/lib/libgambc.so(___device_select+0x104)[0x7fb775d62324] /usr/local/gambit/current/lib/libgambc.so(___os_condvar_select+0x141)[0x7fb775d64d61] /usr/local/gambit/current/lib/libgambc.so(+0x2310a1)[0x7fb775d6c0a1] /usr/local/gambit/current/lib/libgambc.so(___call+0xfa)[0x7fb775d4d2ba] /usr/local/gambit/current/lib/libgambc.so(___setup+0xfc0)[0x7fb775d4f760] /usr/local/gambit/current/lib/libgambc.so(___main+0x2a7)[0x7fb775d4bf57] /usr/local/gambit/current/lib/libgambc.so(___main_char+0xb0)[0x7fb775d59200] /lib64/libc.so.6(__libc_start_main+0xed)[0x7fb7750ac60d] gsi[0x403199]
Build config: ./configure --prefix=/usr/local/gambit --enable-single-host --enable-c-opt --enable-gcc-opts --enable-multiple-versions --enable-shared
To build without fortifications: ./configure CFLAGS="-U_FORTIFY_SOURCE -fno-stack-protector" ... And you'll get a segfault.
-- vyzo
A libevent patch for Gambit was made couple of years ago, can dig it out for your reference and you could make a libev or libevent patch for current Gambit?
Possibly Gambit could use it if it's detected as installed?
(select() on Windows is a mess, duno if either of libev or libevent works around that better these days.)
1024 is not an everyday usecase though I'm with you that it absolutely
ought to be supported natively or via a patch.
Brgds
2013/3/25 Dimitris Vyzovitis vyzo@hackzen.org
I guess this shouldn't be too big a surprise given this definition: /usr/include/bits/typesizes.h:#define __FD_SETSIZE 1024
/usr/include/sys/select.h: typedef struct { #ifdef __USE_XOPEN __fd_mask fds_bits[__FD_SETSIZE / __NFDBITS]; # define __FDS_BITS(set) ((set)->fds_bits) #else __fd_mask __fds_bits[__FD_SETSIZE / __NFDBITS]; # define __FDS_BITS(set) ((set)->__fds_bits) #endif } fd_set;
#define __NFDBITS (8 * (int) sizeof (__fd_mask))
So great. Gambit can't do more than 1024 file descriptors, unless the scheduler is fixed to use poll instead of select.
-- vyzo
On Sun, Mar 24, 2013 at 10:45 PM, Dimitris Vyzovitis vyzo@hackzen.org wrote:
I have a program uses large numbers of file descriptors (over 1024), and it crashes miserably in __fortify_fail. Turning off FORTIFY_SOURCE/stack-protector results in a plain old segfault.
Reproducing with the attached program (crash-it.scm): Platform is GNU/Linux x86-64, gcc is 4.6.3. You need to set your ulimit over 1024 to trigger the crash (otherwise you'll just get "Too many open files" and rain of "integer expected" from the looping threads)
$ ulimit -n 4096 $ gsi crash-it.scm -e "(go 1500)" *** buffer overflow detected ***: gsi terminated ======= Backtrace: ========= /lib64/libc.so.6(__fortify_fail+0x37)[0x7fb775187dd7] /lib64/libc.so.6(+0xfdbe0)[0x7fb775185be0] /lib64/libc.so.6(+0xffd8e)[0x7fb775187d8e]
/usr/local/gambit/current/lib/libgambc.so(___device_select_add_fd+0x55)[0x7fb775d625c5]
/usr/local/gambit/current/lib/libgambc.so(+0x227a91)[0x7fb775d62a91]
/usr/local/gambit/current/lib/libgambc.so(___device_select+0x104)[0x7fb775d62324]
/usr/local/gambit/current/lib/libgambc.so(___os_condvar_select+0x141)[0x7fb775d64d61]
/usr/local/gambit/current/lib/libgambc.so(+0x2310a1)[0x7fb775d6c0a1] /usr/local/gambit/current/lib/libgambc.so(___call+0xfa)[0x7fb775d4d2ba] /usr/local/gambit/current/lib/libgambc.so(___setup+0xfc0)[0x7fb775d4f760] /usr/local/gambit/current/lib/libgambc.so(___main+0x2a7)[0x7fb775d4bf57]
/usr/local/gambit/current/lib/libgambc.so(___main_char+0xb0)[0x7fb775d59200]
/lib64/libc.so.6(__libc_start_main+0xed)[0x7fb7750ac60d] gsi[0x403199]
Build config: ./configure --prefix=/usr/local/gambit --enable-single-host --enable-c-opt --enable-gcc-opts --enable-multiple-versions --enable-shared
To build without fortifications: ./configure CFLAGS="-U_FORTIFY_SOURCE -fno-stack-protector" ... And you'll get a segfault.
-- vyzo
Gambit-list mailing list Gambit-list@iro.umontreal.ca https://webmail.iro.umontreal.ca/mailman/listinfo/gambit-list