Perl / perl5

🐪 The Perl programming language
https://dev.perl.org/perl5/
Other
1.85k stars 527 forks source link

IO::Socket->new() timeout is unreliable #1193

Closed p5pRT closed 20 years ago

p5pRT commented 24 years ago

Migrated from rt.perl.org#2162 (status was 'resolved')

Searchable as RT2162$

p5pRT commented 24 years ago

From tom@you-bastards.com

Created by tom@you-bastards.com

On linux 2.2.14 and presumably on other systems with SA_RESTART\, the timeout feature of IO​::Socket->new() doesn't work. new() uses an alarm() to interrupt connect()\, however as "perldoc -f alarm" states it is necessary to use an eval/die to ensure the call to connect() is not restarted by the system.

This lack of timeout affects other modules such as LWP​::UserAgent\, which won't respect its timeout setting due to this bug.

On a further note it seems a bit presumptuous of IO​::Socket->new() to assume that there are no pending alarms on entry and that it can therefore do alarm(0) to cancel the alarm. It should take note of the return value from alarm() and reset the alarm there was an alarm pending on entry. I know this is a bit tricky to do right but general-purpose library code is a good place to do things right.

Thanks for listening.

Tom.

Perl Info ``` Site configuration information for perl 5.00503: Configured by randolph at Sat Jan 15 02:54:11 MST 2000. Summary of my perl5 (5.0 patchlevel 5 subversion 3) configuration: Platform: osname=linux, osvers=2.3.39, archname=i386-linux uname='linux samwise.tausq.org 2.3.39 #1 smp wed jan 12 05:59:50 mst 2000 i686 unknown ' hint=recommended, useposix=true, d_sigaction=define usethreads=undef useperlio=undef d_sfio=undef Compiler: cc='cc', optimize='-O2', gccversion=2.95.2 19990906 (prerelease) cppflags='-Dbool=char -DHAS_BOOL -D_REENTRANT -DDEBIAN -I/usr/local/include' ccflags ='-Dbool=char -DHAS_BOOL -D_REENTRANT -DDEBIAN -I/usr/local/include' stdchar='char', d_stdstdio=undef, usevfork=false intsize=4, longsize=4, ptrsize=4, doublesize=8 d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12 alignbytes=4, usemymalloc=n, prototype=define Linker and Libraries: ld='cc', ldflags =' -L/usr/local/lib' libpth=/usr/local/lib /lib /usr/lib libs=-lnsl -lndbm -ldb -ldl -lm -lc -lposix -lcrypt libc=, so=so, useshrplib=false, libperl=libperl.a Dynamic Linking: dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-rdynamic' cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib' Locally applied patches: @INC for perl 5.00503: /usr/lib/perl5/5.005/i386-linux /usr/lib/perl5/5.005 /usr/local/lib/site_perl/i386-linux /usr/local/lib/site_perl /usr/lib/perl5 . Environment for perl 5.00503: HOME=/u/home/tom LANG (unset) LANGUAGE (unset) LD_LIBRARY_PATH (unset) LOGDIR (unset) PATH=/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games PERL_BADLANG (unset) SHELL=/bin/bash ```