diff options
-rw-r--r-- | mg.c | 5 | ||||
-rw-r--r-- | t/op/taint.t | 9 |
2 files changed, 12 insertions, 2 deletions
@@ -1079,9 +1079,12 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg) case '$': /* $$ */ { IV const pid = (IV)PerlProc_getpid(); - if (isGV(mg->mg_obj) || SvIV(mg->mg_obj) != pid) + if (isGV(mg->mg_obj) || SvIV(mg->mg_obj) != pid) { /* never set manually, or at least not since last fork */ sv_setiv(sv, pid); + /* never unsafe, even if reading in a tainted expression */ + SvTAINTED_off(sv); + } /* else a value has been assigned manually, so do nothing */ } break; diff --git a/t/op/taint.t b/t/op/taint.t index 0b626f340c..1b754399f9 100644 --- a/t/op/taint.t +++ b/t/op/taint.t @@ -17,7 +17,7 @@ BEGIN { use strict; use Config; -plan tests => 791; +plan tests => 793; $| = 1; @@ -2176,6 +2176,13 @@ for(1,2) { } pass("no death when TARG of ref is tainted"); +# $$ should not be tainted by being read in a tainted expression. +{ + isnt_tainted $$, "PID not tainted initially"; + my $x = $ENV{PATH}.$$; + isnt_tainted $$, "PID not tainted when read in tainted expression"; +} + { use feature 'fc'; use locale; |