[perl #126041] Only clear LS_COLORS for glob
authorFather Chrysostomos <sprout@cpan.org>
Thu, 4 Aug 2016 20:17:32 +0000 (13:17 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Thu, 4 Aug 2016 20:17:32 +0000 (13:17 -0700)
When miniperl calls csh to implement glob(), we clear %ENV temporarily
to avoid csh dying on invalid values for things like LS_COLORS.  That
has proven to have far too many problems, since many system-dependent
env vars are necessary for calling an external process.  See the RT
ticket for details.

A better solution is temporarily to clear only those vars that are
known to be problematic and make csh possibly fail.  There only hap-
pens to be one of those at present, namely LS_COLORS.

doio.c

diff --git a/doio.c b/doio.c
index 856b19a..2dc7082 100644 (file)
--- a/doio.c
+++ b/doio.c
@@ -2608,14 +2608,11 @@ Perl_vms_start_glob
 #endif /* !CSH */
 #endif /* !DOSISH */
     {
-       GV * const envgv = gv_fetchpvs("ENV", 0, SVt_PVHV);
-       SV ** const home = hv_fetchs(GvHV(envgv), "HOME", 0);
-       SV ** const path = hv_fetchs(GvHV(envgv), "PATH", 0);
-       if (home && *home) SvGETMAGIC(*home);
-       if (path && *path) SvGETMAGIC(*path);
-       save_hash(gv_fetchpvs("ENV", 0, SVt_PVHV));
-       if (home && *home) SvSETMAGIC(*home);
-       if (path && *path) SvSETMAGIC(*path);
+        SV ** const svp = hv_fetchs(GvHVn(PL_envgv), "LS_COLORS", 0);
+        if (svp && *svp)
+            save_helem_flags(GvHV(PL_envgv),
+                             newSVpvs_flags("LS_COLORS", SVs_TEMP), svp,
+                             SAVEf_SETMAGIC);
     }
     (void)do_open6(PL_last_in_gv, SvPVX_const(tmpcmd), SvCUR(tmpcmd),
                    NULL, NULL, 0);