Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: putenv()/environ bug
- X-seq: zsh-workers 23730
- From: Peter Stephenson <pws@xxxxxxx>
- To: "Sean C. Farley" <scf@xxxxxxxxxxx>, zsh-workers@xxxxxxxxxx
- Subject: Re: putenv()/environ bug
- Date: Tue, 31 Jul 2007 10:00:05 +0100
- In-reply-to: <20070730173959.B5687@xxxxxxxxxxxxxxx>
- Mailing-list: contact zsh-workers-help@xxxxxxxxxx; run by ezmlm
- Organization: CSR
- References: <20070725093254.T20275@xxxxxxxxxxxxxxx> <20070725215321.00e3b110.p.w.stephenson@xxxxxxxxxxxx> <20070725184302.S23862@xxxxxxxxxxxxxxx> <200707282246.16663.arvidjaar@xxxxxxxxxx> <20070729140248.D2588@xxxxxxxxxxxxxxx> <20070730213934.aefff281.p.w.stephenson@xxxxxxxxxxxx> <20070730215232.ff040a3f.p.w.stephenson@xxxxxxxxxxxx> <20070730173959.B5687@xxxxxxxxxxxxxxx>
On Mon, 30 Jul 2007 17:44:12 -0500 (CDT)
"Sean C. Farley" <scf@xxxxxxxxxxx> wrote:
> The issue only showed up if zsh was executed again.
>
> Example:
> zsh
> export FOO=BAR
> exec zsh
> unset FOO
> env | grep FOO
> echo $FOO
That's useful, I've added it. I've also made the code a bit more rational
about always using setenv() and unsetenv() in pairs (this shouldn't change
the effect except with a wonky library).
Index: Src/exec.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/exec.c,v
retrieving revision 1.120
diff -u -r1.120 exec.c
--- Src/exec.c 30 Jul 2007 20:46:05 -0000 1.120
+++ Src/exec.c 31 Jul 2007 08:57:21 -0000
@@ -529,7 +529,7 @@
* for ARGV0: that's OK since we're about to exec or exit
* on failure.
*/
-#ifdef HAVE_UNSETENV
+#ifdef USE_SET_UNSET_ENV
unsetenv("ARGV0");
#else
delenvvalue(z - 6);
Index: Src/params.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/params.c,v
retrieving revision 1.134
diff -u -r1.134 params.c
--- Src/params.c 30 Jul 2007 20:46:05 -0000 1.134
+++ Src/params.c 31 Jul 2007 08:57:21 -0000
@@ -610,7 +610,7 @@
createparamtable(void)
{
Param ip, pm;
-#if !defined(HAVE_PUTENV) && !defined(HAVE_SETENV)
+#if !defined(HAVE_PUTENV) && !defined(USE_SET_UNSET_ENV)
char **new_environ;
int envsize;
#endif
@@ -665,7 +665,7 @@
setsparam("LOGNAME", ztrdup((str = getlogin()) && *str ? str : cached_username));
-#if !defined(HAVE_PUTENV) && !defined(HAVE_SETENV)
+#if !defined(HAVE_PUTENV) && !defined(USE_SET_UNSET_ENV)
/* Copy the environment variables we are inheriting to dynamic *
* memory, so we can do mallocs and frees on it. */
envsize = sizeof(char *)*(1 + arrlen(environ));
@@ -3855,7 +3855,7 @@
int
zputenv(char *str)
{
-#ifdef HAVE_SETENV
+#ifdef USE_SET_UNSET_ENV
/*
* If we are using unsetenv() to remove values from the
* environment, which is the safe thing to do, we
@@ -3906,7 +3906,7 @@
}
/**/
-#ifndef HAVE_UNSETENV
+#ifndef USE_SET_UNSET_ENV
/**/
static int
findenv(char *name, int *pos)
@@ -3969,12 +3969,10 @@
addenv(Param pm, char *value)
{
char *newenv = 0;
-#ifndef HAVE_UNSETENV
+#ifndef USE_SET_UNSET_ENV
char *oldenv = 0, *env = 0;
int pos;
-#endif
-#ifndef HAVE_UNSETENV
/*
* First check if there is already an environment
* variable matching string `name'.
@@ -3989,7 +3987,7 @@
pm->env = NULL;
return;
}
-#ifdef HAVE_UNSETENV
+#ifdef USE_SET_UNSET_ENV
/*
* If we are using setenv/unsetenv to manage the environment,
* we simply store the string we created in pm->env since
@@ -4052,7 +4050,7 @@
* string. */
-#ifndef HAVE_UNSETENV
+#ifndef USE_SET_UNSET_ENV
/**/
void
delenvvalue(char *x)
@@ -4078,7 +4076,7 @@
void
delenv(Param pm)
{
-#ifdef HAVE_UNSETENV
+#ifdef USE_SET_UNSET_ENV
unsetenv(pm->node.nam);
zsfree(pm->env);
#else
Index: Src/system.h
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/system.h,v
retrieving revision 1.45
diff -u -r1.45 system.h
--- Src/system.h 30 Jul 2007 20:46:05 -0000 1.45
+++ Src/system.h 31 Jul 2007 08:57:22 -0000
@@ -697,8 +697,8 @@
* We always need setenv and unsetenv in pairs, because
* we don't know how to do memory management on the values set.
*/
-#ifndef HAVE_UNSETENV
-#undef HAVE_SETENV
+#if defined(HAVE_SETENV) && defined(HAVE_UNSETENV)
+# define USE_SET_UNSET_ENV
#endif
Index: Test/B02typeset.ztst
===================================================================
RCS file: /cvsroot/zsh/zsh/Test/B02typeset.ztst,v
retrieving revision 1.14
diff -u -r1.14 B02typeset.ztst
--- Test/B02typeset.ztst 30 Jul 2007 20:55:41 -0000 1.14
+++ Test/B02typeset.ztst 31 Jul 2007 08:57:22 -0000
@@ -381,10 +381,27 @@
export ENVFOO=bar
print ENVFOO in environment
env | grep '^ENVFOO'
+ print Changing ENVFOO
+ ENVFOO="not bar any more"
+ env | grep '^ENVFOO'
unset ENVFOO
print ENVFOO no longer in environment
env | grep '^ENVFOO'
1:Adding and removing values to and from the environment
>ENVFOO in environment
>ENVFOO=bar
+>Changing ENVFOO
+>ENVFOO=not bar any more
>ENVFOO no longer in environment
+
+ (export FOOENV=BAR
+ env | grep '^FOOENV'
+ print Exec
+ exec $ZTST_testdir/../Src/zsh -c '
+ print Unset
+ unset FOOENV
+ env | grep "^FOOENV"')
+1:Can unset environment variables after exec
+>FOOENV=BAR
+>Exec
+>Unset
.
Messages sorted by:
Reverse Date,
Date,
Thread,
Author