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

During a system(), unquoted Perl vars are evaluated _after_ the fork() call #13561

Closed
p5pRT opened this issue Jan 28, 2014 · 21 comments
Closed

Comments

@p5pRT
Copy link

p5pRT commented Jan 28, 2014

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

Searchable as RT121105$

@p5pRT
Copy link
Author

p5pRT commented Jan 28, 2014

From gpiero@rm-rf.it

Created by gpiero@rm-rf.it

Hi,

I've recently noticed the following behaviour​:

$ perl -l
print $$;
system 'echo', "$$";
system 'echo', $$;
32480
32480
32488

The last pid printed (from the system() with unquoted $$) is the pid of
the child process, not the one of the parent.

From my tests, this behaviour is in place since 5.16.0. With previous
versions, all the three statements 'correctly' (in DWIM sense) displayed
the parent's pid.

At first I thought it was shelling out even if it shouldn't, but both a
strace and a quick test dismissed this hypothesis​:

$ perl -l
system 'echo $$ $PWD';
system 'echo', $$, $PWD;
800 /home/gpiero
801

Attached you can find the system-evaluate-vars-after-fork.t test file
that I used against various perl versions.
Versions[0] from 5.8.9 to 5.14.4 passed all the three tests.
Versions[0] from 5.16.0 to 5.19.8 failed the first test (but passed the
other two).

system-evaluate-vars-after-fork-portable.t should be an equivalent test
file, but without non core dependencies and possibly portable, suitable
for being included in the test suite, as being suggested on #p5p.

Thanks,
Gian Piero.

[0] Some minor releases missing, but the latest release of every major
version has been tested.

Perl Info

Flags:
     category=core
     severity=low

Site configuration information for perl 5.18.2:

Configured by gpiero at Sat Jan 25 17:34:32 CET 2014.

Summary of my perl5 (revision 5 version 18 subversion 2) configuration:
    
   Platform:
     osname=linux, osvers=3.12-1-amd64, archname=x86_64-linux
     uname='linux caimano 3.12-1-amd64 #1 smp debian 3.12.6-2 (2013-12-29) x86_64 gnulinux '
     config_args='-de -Dprefix=/home/gpiero/perl5/perlbrew/perls/perl-5.18.2 -Aeval:scriptdir=/home/gpiero/perl5/perlbrew/perls/perl-5.18.2/bin'
     hint=recommended, useposix=true, d_sigaction=define
     useithreads=undef, usemultiplicity=undef
     useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
     use64bitint=define, use64bitall=define, uselongdouble=undef
     usemymalloc=n, bincompat5005=undef
   Compiler:
     cc='cc', ccflags ='-fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
     optimize='-O2',
     cppflags='-fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include'
     ccversion='', gccversion='4.8.2', gccosandvers=''
     intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
     d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
     ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
     alignbytes=8, prototype=define
   Linker and Libraries:
     ld='cc', ldflags =' -fstack-protector -L/usr/local/lib'
     libpth=/usr/local/lib /lib/x86_64-linux-gnu /lib/../lib /usr/lib/x86_64-linux-gnu /usr/lib/../lib /lib /usr/lib
     libs=-lnsl -ldl -lm -lcrypt -lutil -lc
     perllibs=-lnsl -ldl -lm -lcrypt -lutil -lc
     libc=, so=so, useshrplib=false, libperl=libperl.a
     gnulibc_version='2.17'
   Dynamic Linking:
     dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
     cccdlflags='-fPIC', lddlflags='-shared -O2 -L/usr/local/lib -fstack-protector'

Locally applied patches:
     


@INC for perl 5.18.2:
     /home/gpiero/perl5/perlbrew/perls/perl-5.18.2/lib/site_perl/5.18.2/x86_64-linux
     /home/gpiero/perl5/perlbrew/perls/perl-5.18.2/lib/site_perl/5.18.2
     /home/gpiero/perl5/perlbrew/perls/perl-5.18.2/lib/5.18.2/x86_64-linux
     /home/gpiero/perl5/perlbrew/perls/perl-5.18.2/lib/5.18.2
     .


Environment for perl 5.18.2:
     HOME=/home/gpiero
     LANG=en_US.UTF-8
     LANGUAGE=en_US:en
     LC_COLLATE=C
     LD_LIBRARY_PATH (unset)
     LOGDIR (unset)
     PATH=/home/gpiero/bin:/home/gpiero/perl5/perlbrew/bin:/home/gpiero/perl5/perlbrew/perls/perl-5.18.2/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
     PERLBREW=command perlbrew
     PERLBREW_BASHRC_VERSION=0.67
     PERLBREW_HOME=/home/gpiero/.perlbrew
     PERLBREW_MANPATH=/home/gpiero/perl5/perlbrew/perls/perl-5.18.2/man
     PERLBREW_PATH=/home/gpiero/perl5/perlbrew/bin:/home/gpiero/perl5/perlbrew/perls/perl-5.18.2/bin
     PERLBREW_PERL=perl-5.18.2
     PERLBREW_ROOT=/home/gpiero/perl5/perlbrew
     PERLBREW_VERSION=0.67
     PERL_BADLANG (unset)
     SHELL=/bin/bash

@p5pRT
Copy link
Author

p5pRT commented Jan 30, 2014

From gpiero@rm-rf.it

Forgotten attachments.

Ciao,
Gian Piero.

@p5pRT
Copy link
Author

p5pRT commented Jan 30, 2014

From gpiero@rm-rf.it

#!./perl

use strict;
use warnings;

use File​::Spec;

require 't/test.pl';
plan( tests => 3 );

# Blatantly copied from _fresh_perl()
{
  my $is_vms = $^O eq 'VMS';
  my $tmpfile = tempfile();

  sub _capture
  {
  my ( $prog, $runperl_args ) = @​_;

  # Given the choice of the mis-parsable {}
  # (we want an anon hash, but a borked lexer might think that it's a block)
  # or relying on taking a reference to a lexical
  # (\ might be mis-parsed, and the reference counting on the pad may go
  # awry)
  # it feels like the least-worse thing is to assume that auto-vivification
  # works. At least, this is only going to be a run-time failure, so won't
  # affect tests using this file but not this function.
  $runperl_args->{progfile} ||= $tmpfile;
  $runperl_args->{stderr} = 1 unless exists $runperl_args->{stderr};

  open TEST, ">$tmpfile" or die "Cannot open $tmpfile​: $!";

  # VMS adjustments
  if ($is_vms)
  {
  $prog =~ s#/dev/null#NL​:#;

  # VMS file locking
  $prog =~ s{if \(-e _ and -f _ and -r _\)}
  {if (-e _ and -f _)}
  }

  print TEST $prog;
  close TEST or die "Cannot close $tmpfile​: $!";

  my $results = runperl(%$runperl_args);
  my $status = $?;

  # Clean up the results into something a bit more predictable.
  $results =~ s/\n+$//;
  $results =~ s/at\s+$​::tempfile_regexp\s+line/at - line/g;
  $results =~ s/of\s+$​::tempfile_regexp\s+aborted/of - aborted/g;

  # bison says 'parse error' instead of 'syntax error',
  # various yaccs may or may not capitalize 'syntax'.
  $results =~ s/^(syntax|parse) error/syntax error/mig;

  if ($is_vms)
  {
  # some tests will trigger VMS messages that won't be expected
  $results =~ s/\n?%[A-Z]+-[SIWEF]-[A-Z]+,.*//;

  # pipes double these sometimes
  $results =~ s/\n\n/\n/g;
  }

  return $results;
  }
}

my $perl
  = defined $ENV{PERLEXE}
  ? $ENV{PERLEXE}
  : which_perl();

sub generate_echo_exe
{
  my $file = File​::Spec->catfile( '.', tempfile() );
  open my $fh, '>', $file
  or die "Cannot open $file​: $!";
  print $fh qq/#!${perl}/, "\n", q/print "@​ARGV\n";/, "\n";
  close $fh
  or die "Cannot close $file​: $!";
  return $file;
}

my $echo = generate_echo_exe();

SKIP​:
{
  chmod 0755, $echo
  or skip( "Cannot make $echo executable​: $!", 3 );

  my @​tests = (
  [ q|system 'ECHO', $$;|, 'system w/ unquoted $$' ],
  [ q|system 'ECHO', "$$";|, 'system w/ quoted $$' ],
  [ q|print qx(ECHO $$);|, 'backticks' ],
  );

  for my $t (@​tests)
  {
  $t->[0] =~ s/ECHO/$echo/g;
  my @​out = split "\n", _capture( $t->[0] . 'print "$$\n";' );
  is( $out[0], $out[1], $t->[1] );
  }
}

@p5pRT
Copy link
Author

p5pRT commented Jan 30, 2014

From gpiero@rm-rf.it

#!/usr/bin/env perl

use strict;
use warnings;

use Test​::More;
use Capture​::Tiny 'capture';

my $pid = $$;

my ($system) = capture { system 'echo', $$ };
my ($quoted_system) = capture { system 'echo', "$$" };
my $backticks = qx/echo $$/;

chomp( $system, $quoted_system, $backticks );

is( $system, $pid, 'system w/ unquoted $$' );
is( $quoted_system, $pid, 'system w/ quoted $$' );
is( $backticks, $pid, 'backticks' );

done_testing();

@p5pRT
Copy link
Author

p5pRT commented Jan 30, 2014

From perl5-porters@perl.org

Gian Piero Carrubba wrote​:

$ perl -l
print $$;
system 'echo', "$$";
system 'echo', $$;
32480
32480
32488

The last pid printed (from the system() with unquoted $$) is the pid of
the child process, not the one of the parent.

I think this is related to #104084.

@p5pRT
Copy link
Author

p5pRT commented Jan 30, 2014

The RT System itself - Status changed from 'new' to 'open'

@p5pRT
Copy link
Author

p5pRT commented Jan 30, 2014

From @iabyn

On Thu, Jan 30, 2014 at 01​:53​:35PM -0000, Father Chrysostomos wrote​:

Gian Piero Carrubba wrote​:

$ perl -l
print $$;
system 'echo', "$$";
system 'echo', $$;
32480
32480
32488

The last pid printed (from the system() with unquoted $$) is the pid of
the child process, not the one of the parent.

I think this is related to #104084.

It bisects to

  commit 0e21945
  Author​: Max Maischein <corion@​corion.net>
  Date​: Sun May 22 21​:36​:57 2011 -0700

  Turn $$ into a magical readonly variable that always fetches getpid() instead of caching it
 
  The intent is that by not caching $$, we eliminate one opportunity for bugs​:
  If one embeds Perl or uses XS and calls fork(3) from C, Perls notion of $$
  may go out of sync with what getpid() returns. By always fetching the
  value of $$ via getpid(), this bug opportunity is eliminated. The overhead
  of always fetching $$ should be small and is likely only used for tempfile
  creation, which should be dwarfed by file system accesses.

Maybe system() should call get magic on its args *before* forking?

--
In economics, the exam questions are the same every year.
They just change the answers.

@p5pRT
Copy link
Author

p5pRT commented Jan 30, 2014

From perl5-porters@perl.org

Dave Mitchell​:

Maybe system() should call get magic on its args *before* forking?

Zigackly.

@p5pRT
Copy link
Author

p5pRT commented Jan 31, 2014

From @rjbs

* via RT <perlbug-followup@​perl.org> [2014-01-28T14​:15​:39]

The last pid printed (from the system() with unquoted $$) is the pid of
the child process, not the one of the parent.

Thanks, that's a great catch!

--
rjbs

@p5pRT
Copy link
Author

p5pRT commented Dec 16, 2016

From jkahrman@mathworks.com

Created by jkahrman@mathworks.com

$$ ($PID, $PROCESS_ID) is not being passed correctly to the process spawned by
system.

5.20.2 (debian 8's package and built independently from source)
--------------------------------------
  DB<2> x $$
0 6169
  DB<3> x $$
0 6169
  DB<4> x system echo => $$
6172
0 0
  DB<5> x system echo => $$
6173
0 0
  DB<7> x system 'echo', $$
7232
0 0
DB<9> x `'echo' $$`
0 6169

5.8.8
--------------------------------------
  DB<1> x $$
0 8307
  DB<2> x $$
0 8307
  DB<3> x system echo => $$
8307
0 0
  DB<4> x `'echo' $$`
0 8307

  DB<5> x system 'echo', $$
8307
0 0

-----------------------------

Running these statements as part of a script behave the same way as the
debugger.

Given this​:
-----------------------------
use POSIX;
$|=1;
print "1\n";
print "pid $$\n";
print "pid ", $$, "\n";
print "getpid ", getpid(), "\n";

print "2\n";
system "echo $$";

print "3\n";
system 'echo', $$;
system 'echo', "$$";
system 'echo', getpid();

print "4\n";
-----------------------------

5.8.8 and 5.14 return the same value everywhere​:
-----------------------------
$ /usr/bin/perl /tmp/perlpid
1
pid 19465
pid 19465
getpid 19465
2
19465
3
19465
19465
19465
4
backtick 19465
-----------------------------

But Perl 5.20 doesn’t return the same value​:
-----------------------------
$ newperl /tmp/perlpid
1
pid 19476
pid 19476
getpid 19476
2
19476
3
19478
19476
19476
4
backtick 19476
-----------------------------

Nor does ActivePerl 5.18​:
-----------------------------
$ /local/perl/ActivePerl-5.18.4/bin/perl /tmp/perlpid
1
pid 20235
pid 20235
getpid 20235
2
20235
3
20237
20235
20235
4
backtick 20235

Perl Info

Flags:
    category=core
    severity=medium

Site configuration information for perl 5.20.2:

Configured by Debian Project at Mon Jan 11 23:24:04 UTC 2016.

Summary of my perl5 (revision 5 version 20 subversion 2) configuration:

  Platform:
    osname=linux, osvers=3.16.0-4-amd64, archname=x86_64-linux-gnu-thread-multi
    uname='linux themisto 3.16.0-4-amd64 #1 smp debian 3.16.7-ckt20-1+deb8u1 (2015-12-14) x86_64 gnulinux '
    config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN -D_FORTIFY_SOURCE=2 -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Dldflags= -Wl,-z,relro -Dlddlflags=-shared -Wl,-z,relro -Dcccdlflags=-fPIC -Darchname=x86_64-linux-gnu -Dprefix=/usr -Dprivlib=/usr/share/perl/5.20 -Darchlib=/usr/lib/x86_64-linux-gnu/perl/5.20 -Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 -Dvendorarch=/usr/lib/x86_64-linux-gnu/perl5/5.20 -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl/5.20.2 -Dsitearch=/usr/local/lib/x86_64-linux-gnu/perl/5.20.2 -Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1 -Dsiteman3dir=/usr/local/man/man3 -Duse64bitint -Dman1ext=1 -Dman3ext=3perl -Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Ud_ualarm -Uusesfio -Uusenm -Ui_libutil -Uversiononly -DDEBUGGING=-g -Doptimize=-O2 -Duseshrplib -Dlibperl=libperl.so.5.20.2 -des'
    hint=recommended, useposix=true, d_sigaction=define
    useithreads=define, usemultiplicity=define
    use64bitint=define, use64bitall=define, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fwrapv -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
    optimize='-O2 -g',
    cppflags='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fwrapv -fno-strict-aliasing -pipe -I/usr/local/include'
    ccversion='', gccversion='4.9.2', gccosandvers=''
    intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
    ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
    alignbytes=8, prototype=define
  Linker and Libraries:
    ld='cc', ldflags =' -fstack-protector -L/usr/local/lib'
    libpth=/usr/local/lib /usr/lib/gcc/x86_64-linux-gnu/4.9/include-fixed /usr/include/x86_64-linux-gnu /usr/lib /lib/x86_64-linux-gnu /lib/../lib /usr/lib/x86_64-linux-gnu /usr/lib/../lib /lib
    libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
    perllibs=-ldl -lm -lpthread -lc -lcrypt
    libc=libc-2.19.so, so=so, useshrplib=true, libperl=libperl.so.5.20
    gnulibc_version='2.19'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
    cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib -fstack-protector'

Locally applied patches:
    DEBPKG:debian/cpan_definstalldirs - Provide a sensible INSTALLDIRS default for modules installed from CPAN.
    DEBPKG:debian/db_file_ver - http://bugs.debian.org/340047 Remove overly restrictive DB_File version check.
    DEBPKG:debian/doc_info - Replace generic man(1) instructions with Debian-specific information.
    DEBPKG:debian/enc2xs_inc - http://bugs.debian.org/290336 Tweak enc2xs to follow symlinks and ignore missing @INC directories.
    DEBPKG:debian/errno_ver - http://bugs.debian.org/343351 Remove Errno version check due to upgrade problems with long-running processes.
    DEBPKG:debian/libperl_embed_doc - http://bugs.debian.org/186778 Note that libperl-dev package is required for embedded linking
    DEBPKG:fixes/respect_umask - Respect umask during installation
    DEBPKG:debian/writable_site_dirs - Set umask approproately for site install directories
    DEBPKG:debian/extutils_set_libperl_path - EU:MM: set location of libperl.a under /usr/lib
    DEBPKG:debian/no_packlist_perllocal - Don't install .packlist or perllocal.pod for perl or vendor
    DEBPKG:debian/prefix_changes - Fiddle with *PREFIX and variables written to the makefile
    DEBPKG:debian/fakeroot - Postpone LD_LIBRARY_PATH evaluation to the binary targets.
    DEBPKG:debian/instmodsh_doc - Debian policy doesn't install .packlist files for core or vendor.
    DEBPKG:debian/ld_run_path - Remove standard libs from LD_RUN_PATH as per Debian policy.
    DEBPKG:debian/libnet_config_path - Set location of libnet.cfg to /etc/perl/Net as /usr may not be writable.
    DEBPKG:debian/mod_paths - Tweak @INC ordering for Debian
    DEBPKG:debian/module_build_man_extensions - http://bugs.debian.org/479460 Adjust Module::Build manual page extensions for the Debian Perl policy
    DEBPKG:debian/prune_libs - http://bugs.debian.org/128355 Prune the list of libraries wanted to what we actually need.
    DEBPKG:fixes/net_smtp_docs - [rt.cpan.org #36038] http://bugs.debian.org/100195 Document the Net::SMTP 'Port' option
    DEBPKG:debian/perlivp - http://bugs.debian.org/510895 Make perlivp skip include directories in /usr/local
    DEBPKG:debian/deprecate-with-apt - http://bugs.debian.org/747628 Point users to Debian packages of deprecated core modules
    DEBPKG:debian/squelch-locale-warnings - http://bugs.debian.org/508764 Squelch locale warnings in Debian package maintainer scripts
    DEBPKG:debian/skip-upstream-git-tests - Skip tests specific to the upstream Git repository
    DEBPKG:debian/patchlevel - http://bugs.debian.org/567489 List packaged patches for 5.20.2-3+deb8u3 in patchlevel.h
    DEBPKG:debian/skip-kfreebsd-crash - http://bugs.debian.org/628493 [perl #96272] Skip a crashing test case in t/op/threads.t on GNU/kFreeBSD
    DEBPKG:fixes/document_makemaker_ccflags - http://bugs.debian.org/628522 [rt.cpan.org #68613] Document that CCFLAGS should include $Config{ccflags}
    DEBPKG:debian/find_html2text - http://bugs.debian.org/640479 Configure CPAN::Distribution with correct name of html2text
    DEBPKG:debian/perl5db-x-terminal-emulator.patch - http://bugs.debian.org/668490 Invoke x-terminal-emulator rather than xterm in perl5db.pl
    DEBPKG:debian/cpan-missing-site-dirs - http://bugs.debian.org/688842 Fix CPAN::FirstTime defaults with nonexisting site dirs if a parent is writable
    DEBPKG:fixes/memoize_storable_nstore - [rt.cpan.org #77790] http://bugs.debian.org/587650 Memoize::Storable: respect 'nstore' option not respected
    DEBPKG:debian/regen-skip - Skip a regeneration check in unrelated git repositories
    DEBPKG:fixes/regcomp-mips-optim - [perl #122817] http://bugs.debian.org/754054 Downgrade the optimization of regcomp.c on mips and mipsel due to a gcc-4.9 bug
    DEBPKG:debian/makemaker-pasthru - http://bugs.debian.org/758471 Pass LD settings through to subdirectories
    DEBPKG:fixes/perldoc-less-R - [rt.cpan.org #98636] http://bugs.debian.org/758689 Tell the 'less' pager to allow terminal escape sequences
    DEBPKG:fixes/pod_man_reproducible_date - http://bugs.debian.org/759405 Support POD_MAN_DATE in Pod::Man for the left-hand footer
    DEBPKG:fixes/io_uncompress_gunzip_inmemory - http://bugs.debian.org/747363 [rt.cpan.org #95494] Fix gunzip to in-memory file handle
    DEBPKG:fixes/socket_test_recv_fix - http://bugs.debian.org/758718 [perl #122657] Compare recv return value to peername in socket test
    DEBPKG:fixes/hurd_socket_recv_todo - http://bugs.debian.org/758718 [perl #122657] TODO checking the result of recv() on hurd
    DEBPKG:fixes/regexp-performance - [0fa70a0] http://bugs.debian.org/777556 [perl #123743] simpify and speed up /.*.../ handling
    DEBPKG:fixes/failed_require_diagnostics - http://bugs.debian.org/781120 [perl #123270] Report inaccesible file on failed require
    DEBPKG:fixes/array-cloning - http://bugs.debian.org/779357 [perl #124127] [902d169] fix cloning arrays with unused elements
    DEBPKG:fixes/perldb-threads - http://bugs.debian.org/779357 [perl #124127] [41ef2c6] lib/perl5db.pl: Restore noop lock prototype
    DEBPKG:fixes/CVE-2015-8607_file_spec_taint_fix - ensure File::Spec::canonpath() preserves taint
    DEBPKG:fixes/encode-unicode-bom - http://bugs.debian.org/798727 [rt.cpan.org #107043] Address https://rt.cpan.org/Public/Bug/Display.html?id=107043
    DEBPKG:debian/encode-unicode-bom-doc - http://bugs.debian.org/798727 Document Debian backport of Encode::Unicode fix


@INC for perl 5.20.2:
    /etc/perl
    /usr/local/lib/x86_64-linux-gnu/perl/5.20.2
    /usr/local/share/perl/5.20.2
    /usr/lib/x86_64-linux-gnu/perl5/5.20
    /usr/share/perl5
    /usr/lib/x86_64-linux-gnu/perl/5.20
    /usr/share/perl/5.20
    /usr/local/lib/site_perl
    .


Environment for perl 5.20.2:
    HOME=/home/jkahrman
    LANG=en_US.utf8
    LANGUAGE (unset)
    LD_LIBRARY_PATH=
    LOGDIR (unset)
    PATH=/usr/local/bin:/usr/bin:/bin:/sbin
    PERL_BADLANG (unset)
    SHELL=/usr/local/bin/tcsh

@p5pRT
Copy link
Author

p5pRT commented Dec 17, 2016

From @jkeenan

On Fri, 16 Dec 2016 17​:41​:21 GMT, jkahrman@​mathworks.com wrote​:

This is a bug report for perl from jkahrman@​mathworks.com,
generated with the help of perlbug 1.40 running under perl 5.20.2.

-----------------------------------------------------------------
[Please describe your issue here]

$$ ($PID, $PROCESS_ID) is not being passed correctly to the process
spawned by
system.

5.20.2 (debian 8's package and built independently from source)
--------------------------------------
DB<2> x $$
0 6169
DB<3> x $$
0 6169
DB<4> x system echo => $$
6172
0 0
DB<5> x system echo => $$
6173
0 0
DB<7> x system 'echo', $$
7232
0 0
DB<9> x `'echo' $$`
0 6169

5.8.8
--------------------------------------
DB<1> x $$
0 8307
DB<2> x $$
0 8307
DB<3> x system echo => $$
8307
0 0
DB<4> x `'echo' $$`
0 8307

DB<5> x system 'echo', $$
8307
0 0

-----------------------------

Running these statements as part of a script behave the same way as
the
debugger.

Given this​:
-----------------------------
use POSIX;
$|=1;
print "1\n";
print "pid $$\n";
print "pid ", $$, "\n";
print "getpid ", getpid(), "\n";

print "2\n";
system "echo $$";

print "3\n";
system 'echo', $$;
system 'echo', "$$";
system 'echo', getpid();

print "4\n";
-----------------------------

5.8.8 and 5.14 return the same value everywhere​:
-----------------------------
$ /usr/bin/perl /tmp/perlpid
1
pid 19465
pid 19465
getpid 19465
2
19465
3
19465
19465
19465
4
backtick 19465
-----------------------------

But Perl 5.20 doesn’t return the same value​:
-----------------------------
$ newperl /tmp/perlpid
1
pid 19476
pid 19476
getpid 19476
2
19476
3
19478
19476
19476
4
backtick 19476
-----------------------------

Nor does ActivePerl 5.18​:
-----------------------------
$ /local/perl/ActivePerl-5.18.4/bin/perl /tmp/perlpid
1
pid 20235
pid 20235
getpid 20235
2
20235
3
20237
20235
20235
4
backtick 20235

Feature, not a bug. The behavior you are observing was introduced five years ago​:

commit 0e21945
Author​: Max Maischein <corion@​corion.net>
AuthorDate​: Sun May 22 21​:36​:57 2011 -0700
Commit​: Father Chrysostomos <sprout@​cpan.org>
CommitDate​: Sun May 22 21​:50​:50 2011 -0700

Turn $$ into a magical readonly variable that always fetches getpid() instead of caching it
 
The intent is that by not caching $$, we eliminate one opportunity for bugs​: If one embeds Perl or uses XS and calls fork(3) from C, Perls notion of $$ may go out of sync with what getpid() returns. By always fetching the value of $$ via getpid(), this bug opportunity is eliminated. The overhead of always fetching $$ should be small and is likely only used for tempfile creation, which should be dwarfed by file system accesses.

--
James E Keenan (jkeenan@​cpan.org)

@p5pRT
Copy link
Author

p5pRT commented Dec 17, 2016

The RT System itself - Status changed from 'new' to 'open'

@p5pRT
Copy link
Author

p5pRT commented Dec 17, 2016

@jkeenan - Status changed from 'open' to 'rejected'

@p5pRT
Copy link
Author

p5pRT commented Dec 17, 2016

From @Leont

On Sat, Dec 17, 2016 at 2​:56 AM, James E Keenan via RT <
perlbug-followup@​perl.org> wrote​:

Feature, not a bug. The behavior you are observing was introduced five
years ago​:

I don't think this can reasonably be described as a feature. This clearly
wasn't the intention of that patch.

This is a a duplicate of #121105, and the fix proposed there still sounds
like the right solution.

Leon

@p5pRT
Copy link
Author

p5pRT commented Dec 17, 2016

@jkeenan - Status changed from 'rejected' to 'open'

@p5pRT
Copy link
Author

p5pRT commented Dec 19, 2016

From @Leont

On Thu, Jan 30, 2014 at 4​:00 PM, Dave Mitchell <davem@​iabyn.com> wrote​:

On Thu, Jan 30, 2014 at 01​:53​:35PM -0000, Father Chrysostomos wrote​:

Gian Piero Carrubba wrote​:

$ perl -l
print $$;
system 'echo', "$$";
system 'echo', $$;
32480
32480
32488

The last pid printed (from the system() with unquoted $$) is the pid of
the child process, not the one of the parent.

I think this is related to #104084.

It bisects to

commit 0e21945565eb4664d843bb819fb032cedee4d5a6
Author&#8203;: Max Maischein \<corion@&#8203;corion\.net>
Date&#8203;:   Sun May 22 21&#8203;:36&#8203;:57 2011 \-0700

Turn $$ into a magical readonly variable that always fetches getpid\(\)

instead of caching it

The intent is that by not caching $$\, we eliminate one opportunity for

bugs​:
If one embeds Perl or uses XS and calls fork(3) from C, Perls notion
of $$
may go out of sync with what getpid() returns. By always fetching the
value of $$ via getpid(), this bug opportunity is eliminated. The
overhead
of always fetching $$ should be small and is likely only used for
tempfile
creation, which should be dwarfed by file system accesses.

Maybe system() should call get magic on its args *before* forking?

The simplest solution would be to just create mortal copies of the stack in
a temporary array.

Though to be honest, that function has been a mess for a long time and the
recent Amigo work made it even worse. What we really want is to split out
much of that logic into a sensible interface, and that interface should
probably be do_aspawn and do_spawn.

Leon

@p5pRT
Copy link
Author

p5pRT commented Dec 16, 2017

From zefram@fysh.org

Fixed in commit 64def2a.

-zefram

@p5pRT
Copy link
Author

p5pRT commented Dec 17, 2017

From @Leont

On Sat, Dec 16, 2017 at 6​:36 AM, Zefram <zefram@​fysh.org> wrote​:

Fixed in commit 64def2a.

Nice!

@p5pRT
Copy link
Author

p5pRT commented Dec 17, 2017

@xsawyerx - Status changed from 'open' to 'pending release'

@p5pRT
Copy link
Author

p5pRT commented Jun 23, 2018

From @khwilliamson

Thank you for filing this report. You have helped make Perl better.

With the release yesterday of Perl 5.28.0, this and 185 other issues have been
resolved.

Perl 5.28.0 may be downloaded via​:
https://metacpan.org/release/XSAWYERX/perl-5.28.0

If you find that the problem persists, feel free to reopen this ticket.

@p5pRT
Copy link
Author

p5pRT commented Jun 23, 2018

@khwilliamson - Status changed from 'pending release' to 'resolved'

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