- if (tainting) {
- MAGIC *mg = 0;
- svp = hv_fetch(GvHVn(envgv),"PATH",4,FALSE);
- if (!svp || *svp == &sv_undef ||
- ((mg = mg_find(*svp, 't')) && mg->mg_len & 1))
- {
- tainted = TRUE;
- if (mg && MgTAINTEDDIR(mg))
- taint_proper("Insecure directory in %s%s", "$ENV{PATH}");
- else
- taint_proper("Insecure %s%s", "$ENV{PATH}");
+#ifdef VMS
+ {
+ int i = 0;
+ char name[10 + TYPE_DIGITS(int)] = "DCL$PATH";
+ STRLEN len = 8; /* strlen(name) */
+
+ while (1) {
+ if (i)
+ len = my_sprintf(name,"DCL$PATH;%d", i);
+ svp = hv_fetch(GvHVn(PL_envgv), name, len, FALSE);
+ if (!svp || *svp == &PL_sv_undef)
+ break;
+ if (SvTAINTED(*svp)) {
+ TAINT;
+ taint_proper("Insecure %s%s", "$ENV{DCL$PATH}");
+ }
+ if ((mg = mg_find(*svp, PERL_MAGIC_envelem)) && MgTAINTEDDIR(mg)) {
+ TAINT;
+ taint_proper("Insecure directory in %s%s", "$ENV{DCL$PATH}");
+ }
+ i++;
+ }
+ }
+#endif /* VMS */
+
+ svp = hv_fetchs(GvHVn(PL_envgv),"PATH",FALSE);
+ if (svp && *svp) {
+ if (SvTAINTED(*svp)) {
+ TAINT;
+ taint_proper("Insecure %s%s", "$ENV{PATH}");
+ }
+ if ((mg = mg_find(*svp, PERL_MAGIC_envelem)) && MgTAINTEDDIR(mg)) {
+ TAINT;
+ taint_proper("Insecure directory in %s%s", "$ENV{PATH}");
+ }
+ }
+
+#ifndef VMS
+ /* tainted $TERM is okay if it contains no metachars */
+ svp = hv_fetchs(GvHVn(PL_envgv),"TERM",FALSE);
+ if (svp && *svp && SvTAINTED(*svp)) {
+ STRLEN len;
+ const bool was_tainted = TAINT_get;
+ const char *t = SvPV_const(*svp, len);
+ const char * const e = t + len;
+
+ TAINT_set(was_tainted);
+#ifdef NO_TAINT_SUPPORT
+ PERL_UNUSED_VAR(was_tainted);
+#endif
+ if (t < e && isWORDCHAR(*t))
+ t++;
+ while (t < e && (isWORDCHAR(*t) || strchr("-_.+", *t)))
+ t++;
+ if (t < e) {
+ TAINT;
+ taint_proper("Insecure $ENV{%s}%s", "TERM");