Skip Menu |
Report information
Id: 121105
Status: resolved
Priority: 0/
Queue: perl5

Owner: Nobody
Requestors: gpiero [at] rm-rf.it
jkahrman [at] mathworks.com
Cc:
AdminCc:

Operating System: Linux
PatchStatus: (no value)
Severity: low
Type: core
Perl Version: 5.18.2
Fixed In: 5.27.7



Date: Tue, 28 Jan 2014 20:15:01 +0100
Subject: During a system(), unquoted Perl vars are evaluated _after_ the fork() call
To: perlbug [...] perl.org
From: Gian Piero Carrubba <gpiero [...] rm-rf.it>
Download (untitled) / with headers
text/plain 4.5k
This is a bug report for perl from gpiero@rm-rf.it, generated with the help of perlbug 1.39 running under perl 5.18.2. ----------------------------------------------------------------- [Please describe your issue here] 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. [Please do not change anything below this line] ----------------------------------------------------------------- --- 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
To: perlbug-followup [...] perl.org
Subject: Re: [perl #121105] perlbug AutoReply: During a system(), unquoted Perl vars are evaluated _after_ the fork() call
From: Gian Piero Carrubba <gpiero [...] rm-rf.it>
Date: Tue, 28 Jan 2014 20:23:06 +0100
Forgotten attachments. Ciao, Gian Piero.

Message body is not shown because sender requested not to inline it.

Message body is not shown because sender requested not to inline it.

From: Father Chrysostomos <sprout [...] cpan.org>
To: perl5-porters [...] perl.org
Subject: Re: [perl #121105] During a system(), unquoted Perl vars are evaluated _after_ the fork() call
Date: 30 Jan 2014 13:53:35 -0000
Download (untitled) / with headers
text/plain 282b
Gian Piero Carrubba wrote: Show quoted text
> $ 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.
From: Dave Mitchell <davem [...] iabyn.com>
To: perl5-porters [...] perl.org
Subject: Re: [perl #121105] During a system(), unquoted Perl vars are evaluated _after_ the fork() call
Date: Thu, 30 Jan 2014 15:00:14 +0000
Download (untitled) / with headers
text/plain 1.2k
On Thu, Jan 30, 2014 at 01:53:35PM -0000, Father Chrysostomos wrote: Show quoted text
> 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: 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.
Date: 30 Jan 2014 17:24:33 -0000
From: Father Chrysostomos <sprout [...] cpan.org>
Subject: Re: [perl #121105] During a system(), unquoted Perl vars are evaluated _after_ the fork() call
To: perl5-porters [...] perl.org
Dave Mitchell: Show quoted text
> Maybe system() should call get magic on its args *before* forking?
Zigackly.
Date: Fri, 31 Jan 2014 10:02:08 -0500
From: Ricardo Signes <perl.p5p [...] rjbs.manxome.org>
Subject: Re: [perl #121105] During a system(), unquoted Perl vars are evaluated _after_ the fork() call
To: perl5-porters [...] perl.org
Download (untitled) / with headers
text/plain 223b
* via RT <perlbug-followup@perl.org> [2014-01-28T14:15:39] Show quoted text
> 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
Download signature.asc
application/pgp-signature 490b

Message body not shown because it is not plain text.

To: perlbug [...] perl.org
Date: Fri, 16 Dec 2016 12:40:56 -0500
From: jkahrman [...] mathworks.com
Subject: Child process doesn't receive correct argument when 'system' is passed $PROCESS_ID as a separate argument
Download (untitled) / with headers
text/plain 10.4k
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 [Please do not change anything below this line] ----------------------------------------------------------------- --- 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
RT-Send-CC: perl5-porters [...] perl.org
Download (untitled) / with headers
text/plain 2.9k
On Fri, 16 Dec 2016 17:41:21 GMT, jkahrman@mathworks.com wrote: Show quoted text
> > 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 0e21945565eb4664d843bb819fb032cedee4d5a6 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)
Subject: Re: [perl #130360] Child process doesn't receive correct argument when 'system' is passed $PROCESS_ID as a separate argument
CC: Perl5 Porters <perl5-porters [...] perl.org>
To: perlbug <perlbug-followup [...] perl.org>
Date: Sat, 17 Dec 2016 19:19:46 +0100
From: Leon Timmermans <fawaka [...] gmail.com>
Download (untitled) / with headers
text/plain 397b
On Sat, Dec 17, 2016 at 2:56 AM, James E Keenan via RT <perlbug-followup@perl.org> wrote:
Show quoted text
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


Subject: Re: [perl #121105] During a system(), unquoted Perl vars are evaluated _after_ the fork() call
CC: Perl5 Porters <perl5-porters [...] perl.org>
From: Leon Timmermans <fawaka [...] gmail.com>
To: Dave Mitchell <davem [...] iabyn.com>
Date: Mon, 19 Dec 2016 16:09:45 +0100
Download (untitled) / with headers
text/plain 1.6k
On Thu, Jan 30, 2014 at 4:00 PM, Dave Mitchell <davem@iabyn.com> wrote:
Show quoted text
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: 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?

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


From: Zefram <zefram [...] fysh.org>
Subject: Re: [perl #121105] During a system(), unquoted Perl vars are evaluated _after_ the fork() call
Date: Sat, 16 Dec 2017 05:36:29 +0000
To: perl5-porters [...] perl.org
Fixed in commit 64def2aeaeb63f92dadc6dfa33486c1d7b311963. -zefram
From: Leon Timmermans <fawaka [...] gmail.com>
CC: Perl5 Porters <perl5-porters [...] perl.org>
To: Zefram <zefram [...] fysh.org>
Date: Sun, 17 Dec 2017 13:33:35 +0100
Subject: Re: [perl #121105] During a system(), unquoted Perl vars are evaluated _after_ the fork() call
Download (untitled) / with headers
text/plain 135b
On Sat, Dec 16, 2017 at 6:36 AM, Zefram <zefram@fysh.org> wrote:
Show quoted text
Fixed in commit 64def2aeaeb63f92dadc6dfa33486c1d7b311963.

Nice!
Download (untitled) / with headers
text/plain 317b
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.


This service is sponsored and maintained by Best Practical Solutions and runs on Perl.org infrastructure.

For issues related to this RT instance (aka "perlbug"), please contact perlbug-admin at perl.org