summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mg.c5
-rw-r--r--t/op/taint.t9
2 files changed, 12 insertions, 2 deletions
diff --git a/mg.c b/mg.c
index f450d17000..8b30f93497 100644
--- a/mg.c
+++ b/mg.c
@@ -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;