Perl / perl5

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

Attempt to free unreferenced scalar error #1156

Closed p5pRT closed 20 years ago

p5pRT commented 24 years ago

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

Searchable as RT2122$

p5pRT commented 24 years ago

From mina@diane.idirect.com

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

p5pRT commented 24 years ago

From [Unknown Contact. See original ticket]

Mina Naguib \mina@&#8203;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\\, or die-ing with a constant argument. Doing I/O such as print() is a complete no-no.

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

p5pRT commented 24 years ago

From [Unknown Contact. See original ticket]

M . J . T . Guy \mjtg@&#8203;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

p5pRT commented 24 years ago

From [Unknown Contact. See original ticket]

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

p5pRT commented 20 years ago

From The RT System itself

signal handlers are a known problem and documented as unstable.