(F) While under the C<use filetest> pragma, switching the real and
effective uids or gids failed.
+=item %ENV is aliased to %s
+
+(F) You're running under taint mode, and the C<%ENV> variable has been
+aliased to another hash, so it doesn't reflect anymore the state of the
+program's environment. This is potentially insecure.
+
=item Error converting file specification %s
(F) An error peculiar to VMS. Because Perl may have to deal with file
}
{
- # test with a non-magical %ENV (and non-magical %ENV elements)
- our %nonmagicalenv = ( PATH => $TAINT );
+ # [perl #24291] this used to dump core
+ our %nonmagicalenv = ( PATH => "util" );
local *ENV = \%nonmagicalenv;
eval { system("lskdfj"); };
- test 207, $@ =~ /Insecure \$ENV{PATH} while running with -T switch/;
- # [perl #24291] this used to dump core
- %nonmagicalenv = ( PATH => "util" );
+ test 207, $@ =~ /^%ENV is aliased to another variable while running with -T switch/;
+ local *ENV = *nonmagicalenv;
eval { system("lskdfj"); };
- test 208, 1;
+ test 208, $@ =~ /^%ENV is aliased to %nonmagicalenv while running with -T switch/;
}
NULL
};
- /* Don't bother if there's no %ENV hash */
- if (!PL_envgv || !GvHV(PL_envgv))
+ /* Don't bother if there's no *ENV glob */
+ if (!PL_envgv)
return;
+ /* If there's no %ENV hash of if it's not magical, croak, because
+ * it probably doesn't reflect the actual environment */
+ if (!GvHV(PL_envgv) || !(SvRMAGICAL(GvHV(PL_envgv))
+ && mg_find((SV*)GvHV(PL_envgv), PERL_MAGIC_env))) {
+ bool was_tainted = PL_tainted;
+ char *name = GvENAME(PL_envgv);
+ PL_tainted = TRUE;
+ if (strEQ(name,"ENV"))
+ /* hash alias */
+ taint_proper("%%ENV is aliased to %s%s", "another variable");
+ else
+ /* glob alias: report it in the error message */
+ taint_proper("%%ENV is aliased to %%%s%s", name);
+ /* this statement is reached under -t or -U */
+ PL_tainted = was_tainted;
+ }
#ifdef VMS
{
TAINT;
taint_proper("Insecure %s%s", "$ENV{DCL$PATH}");
}
- if (SvMAGICAL(*svp)
- && (mg = mg_find(*svp, PERL_MAGIC_envelem))
- && MgTAINTEDDIR(mg)) {
+ if ((mg = mg_find(*svp, PERL_MAGIC_envelem)) && MgTAINTEDDIR(mg)) {
TAINT;
taint_proper("Insecure directory in %s%s", "$ENV{DCL$PATH}");
}
TAINT;
taint_proper("Insecure %s%s", "$ENV{PATH}");
}
- if (SvMAGICAL(*svp)
- && (mg = mg_find(*svp, PERL_MAGIC_envelem))
- && MgTAINTEDDIR(mg)) {
+ if ((mg = mg_find(*svp, PERL_MAGIC_envelem)) && MgTAINTEDDIR(mg)) {
TAINT;
taint_proper("Insecure directory in %s%s", "$ENV{PATH}");
}