Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Attempt to free unreferenced scalar error #1156

Closed
p5pRT opened this issue Feb 8, 2000 · 5 comments
Closed

Attempt to free unreferenced scalar error #1156

p5pRT opened this issue Feb 8, 2000 · 5 comments

Comments

@p5pRT
Copy link

p5pRT commented Feb 8, 2000

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

Searchable as RT2122$

@p5pRT
Copy link
Author

p5pRT commented Feb 8, 2000

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
Copy link
Author

p5pRT commented Feb 11, 2000

From [Unknown Contact. See original ticket]

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<return>, 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
Copy link
Author

p5pRT commented Feb 13, 2000

From [Unknown Contact. See original ticket]

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<return>, 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
Copy link
Author

p5pRT commented Feb 13, 2000

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<return>, 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
Copy link
Author

p5pRT commented Nov 28, 2003

From The RT System itself

signal handlers are a known problem and documented as unstable.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant