X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/9014280dc8264580f076d4325a59f22a11592058..8bbf3450a1ff0a3996dade29a4194cc0939d871f:/taint.c diff --git a/taint.c b/taint.c index 7914e64..2c2e66e 100644 --- a/taint.c +++ b/taint.c @@ -1,6 +1,7 @@ /* taint.c * - * Copyright (c) 1997-2002, Larry Wall + * Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, + * 2000, 2001, 2002, by Larry Wall and others * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. @@ -79,8 +80,25 @@ Perl_taint_env(pTHX) NULL }; + /* 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 { @@ -129,7 +147,7 @@ Perl_taint_env(pTHX) PL_tainted = was_tainted; if (t < e && isALNUM(*t)) t++; - while (t < e && (isALNUM(*t) || *t == '-' || *t == ':')) + while (t < e && (isALNUM(*t) || strchr("-_.+", *t))) t++; if (t < e) { TAINT;