Perl / perl5

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

timeout problem in IO::Socket #1197

Closed p5pRT closed 20 years ago

p5pRT commented 24 years ago

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

Searchable as RT2167$

p5pRT commented 24 years ago

From wilfredm@inet.kpn.com

Created by wmollenvanger@yahoo.com

The LWP library I'm using had problems with defined timeouts so I traced it back to IO​::Socket​::connect​:

sub connect {   @​_ == 2 || @​_ == 3 or croak 'usage​: $fh->connect(NAME) or $fh->connect(PORT\, ADDR)';   my $fh = shift;   my $addr = @​_ == 1 ? shift : sockaddr_in(@​_);   my $timeout = ${*$fh}{'io_socket_timeout'};   local($SIG{ALRM}) = $timeout ? sub { undef $fh; }   : $SIG{ALRM} || 'DEFAULT';

  eval {   croak 'connect​: Bad address'   if(@​_ == 2 && !defined $_[1]);

  if($timeout) {   defined $Config{d_alarm} && defined alarm($timeout) or   $timeout = 0;   }

  my $ok = connect($fh\, $addr);

  alarm(0)   if($timeout);

  croak "connect​: timeout"   unless defined $fh;

  undef $fh unless $ok;   };

  $fh; }

Shouldn't the line were the signal handler is defined read​:

local($SIG{ALRM}) = $timeout ? sub { undef $fh; die; }   : $SIG{ALRM} || 'DEFAULT';

otherwise it will 'never' timeout on the connect() call.

Regards\,

Wilfred.

Perl Info ``` Site configuration information for perl 5.00503: Configured by root at Mon Aug 30 23:08:56 EDT 1999. Summary of my perl5 (5.0 patchlevel 5 subversion 3) configuration: Platform: osname=linux, osvers=2.2.5-22smp, archname=i386-linux uname='linux porky.devel.redhat.com 2.2.5-22smp #1 smp wed jun 2 09:11:51 edt 1999 i686 unknown ' hint=recommended, useposix=true, d_sigaction=define usethreads=undef useperlio=undef d_sfio=undef Compiler: cc='cc', optimize='-O2', gccversion=egcs-2.91.66 19990314/Linux (egcs-1.1.2 release) cppflags='-Dbool=char -DHAS_BOOL -I/usr/local/include' ccflags ='-Dbool=char -DHAS_BOOL -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 -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.00503/i386-linux /usr/lib/perl5/5.00503 /usr/lib/perl5/site_perl/5.005/i386-linux /usr/lib/perl5/site_perl/5.005 . Environment for perl 5.00503: HOME=/export/home/wilfredm LANG=en_US LANGUAGE (unset) LC_ALL=en_US LD_LIBRARY_PATH (unset) LOGDIR (unset) PATH=/usr/bin:/bin:/usr/X11R6/bin:/usr/local/bin:/opt/bin:/usr/X11R6/bin:/export/home/wilfredm/bin:/usr/local/ssh/bin: PERL_BADLANG (unset) SHELL=/bin/bash ```
p5pRT commented 24 years ago

From @gisle

Wilfred Mollenvanger \wilfredm@​inet\.kpn\.com writes​:

----------------------------------------------------------------- [Please enter your report here] The LWP library I'm using had problems with defined timeouts so I traced it back to IO​::Socket​::connect​:

sub connect { @​_ == 2 || @​_ == 3 or croak 'usage​: $fh->connect(NAME) or $fh->connect(PORT\, ADDR)'; my $fh = shift; my $addr = @​_ == 1 ? shift : sockaddr_in(@​_); my $timeout = ${*$fh}{'io_socket_timeout'}; local($SIG{ALRM}) = $timeout ? sub { undef $fh; } : $SIG{ALRM} || 'DEFAULT';

 eval \{
    croak 'connect​: Bad address'
        if\(@​\_ == 2 && \!defined $\_\[1\]\);

    if\($timeout\) \{
        defined $Config\{d\_alarm\} && defined alarm\($timeout\) or
            $timeout = 0;
    \}

    my $ok = connect\($fh\, $addr\);

    alarm\(0\)
        if\($timeout\);

    croak "connect​: timeout"
        unless defined $fh;

    undef $fh unless $ok;
\};

$fh;

}

Shouldn't the line were the signal handler is defined read​:

local($SIG{ALRM}) = $timeout ? sub { undef $fh; die; } : $SIG{ALRM} || 'DEFAULT';

otherwise it will 'never' timeout on the connect() call.

The latest version of IO​::Socket\, which is bundled with perl5.5.650 (perl's latest development release) will use non-blocking connect instead of alarm. You can can achieve the same with perl5.005_03 by installing IO-1.20 from CPAN.

I don't know if perl5.005_04 if/when it comes out will try to upgrade the IO modules\, but I doubt it.

Regards\, Gisle