summaryrefslogtreecommitdiff
path: root/mg.c
diff options
context:
space:
mode:
authorHans Mulder <hansm@euronet.nl>1997-05-29 20:30:44 +1200
committerTim Bunce <Tim.Bunce@ig.co.uk>1997-06-11 12:00:00 +1200
commit66b1d5575fd5eb6242bac2e9a08b163be8b1b960 (patch)
tree494f32324f1768f55f5912b08ed6164b414f00ae /mg.c
parent5117ca915f2c72e17e52c313797ad394bd76c418 (diff)
downloadperl-66b1d5575fd5eb6242bac2e9a08b163be8b1b960.tar.gz
ENV leaks on win32 (was Re: Comments on ENV patch sought)
Subject: [PATCH] for NETaa13787: %ENV=(); doesn't clear the environment Perl maintains two representations of the environment: (A) a hash named %ENV, used by the perl script (B) a char** named environ, which is passed to child processes Obviously, the intent is to keep tho two in sync. This fails in two situations: (1) A list assignment to %ENV clears (A) but not (B); (2) Assigning to $0 has the side effect of deleting the key NoNeSuCh form (B) but not from (A). $ perl -e '%ENV=(); print "home\n" if exists $ENV{HOME}; exec "echo \$HOME";' /Users/hansm $ perl -e '$ENV{NoNeSuCh} = "foo"; $0 = "bar"; exec "echo \$NoNeSuCh";' $ perl -e '$ENV{NoNeSuCh} = "foo"; exec "echo \$NoNeSuCh";' foo $ I've complained about rpoblem (1) before; and Larry assigned it bug ID NETaa13787 when he entered it into DDTS. The patch below attempts to remedy both problems, at least on Unix platforms. I don't know how to handle the environment on VMS and WIN32; my code simply calls DIE('unimplemented"), which is honest but won't make users on those plaforms happy. p5p-msgid: 199705292240.AAA01135@mail.euronet.nl Signed-off-by: Peter Prymmer <pvhp@forte.com>
Diffstat (limited to 'mg.c')
-rw-r--r--mg.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/mg.c b/mg.c
index cab0e5973e..3d1e1ee16b 100644
--- a/mg.c
+++ b/mg.c
@@ -654,6 +654,25 @@ MAGIC* mg;
}
int
+magic_clear_all_env()
+{
+#if defined(VMS) || defined(WIN32)
+ DIE("'%ENV = @list;' is not implemented on this machine");
+#else
+ I32 i;
+
+ if (environ == origenviron)
+ New(901, environ, 1, char*);
+ else
+ for (i = 0; environ[i]; i++)
+ Safefree(environ[i]);
+ environ[0] = Nullch;
+
+ return 0;
+#endif
+}
+
+int
magic_getsig(sv,mg)
SV* sv;
MAGIC* mg;
@@ -1574,7 +1593,7 @@ MAGIC* mg;
}
/* can grab env area too? */
if (origenviron && origenviron[0] == s + 1) {
- my_setenv("NoNeSuCh", Nullch);
+ my_setenv("NoNe SuCh", Nullch);
/* force copy of environment */
for (i = 0; origenviron[i]; i++)
if (origenviron[i] == s + 1)