summaryrefslogtreecommitdiff
path: root/mg.c
diff options
context:
space:
mode:
authorNiko Tyni <ntyni@debian.org>2010-11-13 00:02:07 +0200
committerFather Chrysostomos <sprout@cpan.org>2010-11-14 16:52:23 -0800
commit125b9982af05cc67a7f8daefd5060a9eb9524824 (patch)
treedf0d7e0e78095a25e83cae94af54a54302f342fc /mg.c
parent99e6ea262e0d5e6a5eea5692f2b99d422027c0a4 (diff)
downloadperl-125b9982af05cc67a7f8daefd5060a9eb9524824.tar.gz
Implement $^A tainting
The format accumulator $^A now becomes tainted when formline() is called with tainted data. There is still one failing test from the TODO set; it seems that the $^A get magic is handled too late for the taintedness to show up.
Diffstat (limited to 'mg.c')
-rw-r--r--mg.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/mg.c b/mg.c
index 4a342d4d81..e734d8028b 100644
--- a/mg.c
+++ b/mg.c
@@ -809,6 +809,8 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
switch (*mg->mg_ptr) {
case '\001': /* ^A */
sv_setsv(sv, PL_bodytarget);
+ if (SvTAINTED(PL_bodytarget))
+ SvTAINTED_on(sv);
break;
case '\003': /* ^C, ^CHILD_ERROR_NATIVE */
if (nextchar == '\0') {
@@ -2395,6 +2397,7 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
const char * const remaining = mg->mg_ptr + 1;
I32 i;
STRLEN len;
+ MAGIC *tmg;
PERL_ARGS_ASSERT_MAGIC_SET;
@@ -2431,6 +2434,13 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
break;
case '\001': /* ^A */
sv_setsv(PL_bodytarget, sv);
+ /* mg_set() has temporarily made sv non-magical */
+ if (PL_tainting) {
+ if ((tmg = mg_find(sv,PERL_MAGIC_taint)) && tmg->mg_len & 1)
+ SvTAINTED_on(PL_bodytarget);
+ else
+ SvTAINTED_off(PL_bodytarget);
+ }
break;
case '\003': /* ^C */
PL_minus_c = cBOOL(SvIV(sv));