From 1203306491d341ed2f463fbd53a687cff1675d65 Mon Sep 17 00:00:00 2001 From: Chip Salzenberg Date: Tue, 24 Jul 2012 00:39:46 -0700 Subject: [PATCH] ensure that the env var SV after C<{FOO}='x'> is PV only --- ext/Devel-Peek/Changes | 2 ++ ext/Devel-Peek/Peek.pm | 2 +- ext/Devel-Peek/t/Peek.t | 4 +++- mg.c | 13 +++++++++---- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/ext/Devel-Peek/Changes b/ext/Devel-Peek/Changes index 39bbf91..0bd9583 100644 --- a/ext/Devel-Peek/Changes +++ b/ext/Devel-Peek/Changes @@ -66,3 +66,5 @@ 1.02: 2004-10-22: Document "hash quality" output and update examples. +1.09: + 2012-07-23: Modify tests for 5.18's slightly different flags. diff --git a/ext/Devel-Peek/Peek.pm b/ext/Devel-Peek/Peek.pm index d066c9d..7622efe 100644 --- a/ext/Devel-Peek/Peek.pm +++ b/ext/Devel-Peek/Peek.pm @@ -3,7 +3,7 @@ package Devel::Peek; -$VERSION = '1.08'; +$VERSION = '1.09'; $XS_VERSION = $VERSION; $VERSION = eval $VERSION; diff --git a/ext/Devel-Peek/t/Peek.t b/ext/Devel-Peek/t/Peek.t index dd9d102..1d0de0d 100644 --- a/ext/Devel-Peek/t/Peek.t +++ b/ext/Devel-Peek/t/Peek.t @@ -542,6 +542,8 @@ do_test('scalar with pos magic', # TAINTEDDIR is not set on: OS2, AMIGAOS, WIN32, MSDOS # environment variables may be invisibly case-forced, hence the (?i:PATH) # C is turned into an IV on VMS hence the (?:IV)? +# Perl 5.18 ensures all env vars end up as strings only, hence the (?:,pIOK)? +# Perl 5.18 ensures even magic vars have public OK, hence the (?:,POK)? # VMS is setting FAKE and READONLY flags. What VMS uses for storing # ENV hashes is also not always null terminated. # @@ -549,7 +551,7 @@ do_test('tainted value in %ENV', $ENV{PATH}=@ARGV, # scalar(@ARGV) is a handy known tainted value 'SV = PVMG\\($ADDR\\) at $ADDR REFCNT = 1 - FLAGS = \\(GMG,SMG,RMG,IOK,POK,pIOK,pPOK\\) + FLAGS = \\(GMG,SMG,RMG(?:,POK)?(?:,pIOK)?,pPOK\\) IV = 0 NV = 0 PV = $ADDR "0"\\\0 diff --git a/mg.c b/mg.c index a182aad..317f00a 100644 --- a/mg.c +++ b/mg.c @@ -1164,12 +1164,17 @@ Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg) { dVAR; STRLEN len = 0, klen; - const char *s = SvOK(sv) ? SvPV_const(sv,len) : ""; - const char * const ptr = MgPV_const(mg,klen); - my_setenv(ptr, s); + const char * const key = MgPV_const(mg,klen); + const char *s = ""; PERL_ARGS_ASSERT_MAGIC_SETENV; + if (SvOK(sv)) { + s = SvPV_const(sv,len); + SvPOK_only(sv); /* environment variables are strings, period */ + } + my_setenv(key, s); /* does the deed */ + #ifdef DYNAMIC_ENV_FETCH /* We just undefd an environment var. Is a replacement */ /* waiting in the wings? */ @@ -1212,7 +1217,7 @@ Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg) } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf)); } #endif /* VMS */ - if (s && klen == 4 && strEQ(ptr,"PATH")) { + if (s && klen == 4 && strEQ(key,"PATH")) { const char * const strend = s + len; while (s < strend) { -- 2.7.4