Closed p5pRT closed 20 years ago
This is a bug report for perl from open@idirect.com\, generated with the help of perlbug 1.26 running under perl 5.00503.
Hello I was advised by everyone at #perl on efnet to report this bug to you via perlbug.
Here is a simple server I wrote\, here's how to replicate the bug. (well\, that's how I get the bug):
Run the server\, it defaults to listening on to port 9000
launch 4-6 telnet sessions to the server:port so the server will fork 4-6 clients
press CTRL+C to terminate the server (without closing the telnet connections first)
It goes into the exit procedure but the last line it displays is always the error message : Attempt to free unreferenced scalar
It doesn't seem to have any side effect on the program\, however\, I thought I would report. It would certainly be nice to get rid of it.
Would like to hear back from you soon :) Thank you for your time.
#!/usr/bin/perl
# # MY FIRST GENERIC TCP SERVER # Written by Mina Naguib [ open@idirect.com ] #
$|++;
use IO::Socket; use Net::hostent;
$SIG{INT} = sub { if ($childpid eq "0") { # print $client "Sorry\, but I have to go now..\n"; close $client; } else { # print "Server going down\n"; close $server; } exit 0; }; $SIG{CHLD} = \&REAPER;
init(); mainloop();
sub init() { $TOTALCHILDREN = "0"; my $port = shift(@ARGV) || 9000; $server = IO::Socket::INET->new( Proto => 'tcp'\, LocalPort => $port\, Listen => SOMAXCONN\, Reuse => 1); die "Can't setup server. Port used ? or under 1024 and you're not root ?\n" unless $server; print "Listening on port $port . . .\n"; $0 = "TCPSERV Listening"; }
sub mainloop() { while ($client = $server->accept()) { $childpid = fork(); if ($childpid eq "0") { # # The fork went fine\, I'm the client # $client->autoflush(1); my $hostinfo = gethostbyaddr($client->peeraddr); printf "[Connect from %s]\n"\, $hostinfo->name || $client->peerhost; $0 = "TCPSERV - " . $client->peerhost; handleclient(); } elsif (!defined $childpid) { # # The fork didn't work\, I'm the server # die "I can't fork like this!\n"; } else { # # The fork went fine\, I'm the server # $TOTALCHILDREN++; close $client; } } }
sub handleclient() { print $client "Welcome to TCPSERV\n"; while (\<$client>) { chomp; print $client "$_\n"; } close $client; exit 0; }
sub REAPER() { my $temp = wait; $SIG{CHLD} = \&REAPER; # loathe sysV print "Client PID $temp just got reaped\n"; $TOTALCHILDREN--; }
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=/home/mina LANG=en_US LANGUAGE (unset) LC_ALL=en_US LD_LIBRARY_PATH (unset) LOGDIR (unset) PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/mina/bin:.:/home/mina/util:/usr/sbin PERL_BADLANG (unset) SHELL=/bin/bash
Mina Naguib \mina@​diane\.idirect\.com wrote
It goes into the exit procedure but the last line it displays is always the error message : Attempt to free unreferenced scalar
This may or may not be the cause of your problem\, but note that
Signals are not safe in current versions of Perl.
You should do as little as possible in a signal handler\, either just
setting a (predeclared) variable to a constant value then *explicitly*
doing C\
Of course\, in a SIGCHLD handler\, you have to do a wait()\, but you should do as little else as possible.
There are plans to make signal handling reliable in the next major release of Perl\, but until then\, you'll have to live with the restrictions.
Mike Guy
M . J . T . Guy \mjtg@​cus\.cam\.ac\.uk writes:
You should do as little as possible in a signal handler\, either just setting a (predeclared) variable to a constant value then *explicitly* doing C\
\, or die-ing with a constant argument.
I don't think 'die-ing' is safe either - perl is coing to copy the string\, which involves malloc() and we may be in a non-reentrant malloc()...
-- Nick Ing-Simmons
Nick Ing-Simmons writes:
You should do as little as possible in a signal handler\, either just setting a (predeclared) variable to a constant value then *explicitly* doing C\
\, or die-ing with a constant argument. I don't think 'die-ing' is safe either - perl is coing to copy the string\, which involves malloc() and we may be in a non-reentrant malloc()...
Sigh... Should I repeat it again and again and again and again?
malloc() has only a tiny relationship to problems of sighandlers. A sighandler which does not call malloc() has only a negligibly lower chance of damage than a sighandler which calls malloc().
Most of the damage happens in pp_entersub().
Ilya
signal handlers are a known problem and documented as unstable.
Migrated from rt.perl.org#2122 (status was 'resolved')
Searchable as RT2122$