[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: {un,}setenv fixes
From: |
Eric Blake |
Subject: |
Re: {un,}setenv fixes |
Date: |
Tue, 17 Nov 2009 06:38:41 -0700 |
User-agent: |
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.23) Gecko/20090812 Thunderbird/2.0.0.23 Mnenhy/0.7.6.666 |
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
According to Jim Meyering on 11/17/2009 2:45 AM:
>> I'll test on a few more platforms, then push.
>
> test-unsetenv is failing on Solaris 10:
Well, you obviously spotted a platform I missed in re-testing. ;)
> The above makes me wonder if Solaris 10 needs the unsetenv replacement.
Yep. Like so.
- --
Don't work too hard, make some time for fun as well!
Eric Blake address@hidden
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Public key at home.comcast.net/~ericblake/eblake.gpg
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
iEYEARECAAYFAksCp2EACgkQ84KuGfSFAYBQXACfZ9i/uf1kaauGJ1U9E0kTTKrZ
h2EAn20eVo9ylotWik+tEMzlH5ySrAmt
=GDyk
-----END PGP SIGNATURE-----
>From 41d42744e7a191342b71e4fe21517679b6a02a5e Mon Sep 17 00:00:00 2001
From: Eric Blake <address@hidden>
Date: Tue, 17 Nov 2009 06:31:34 -0700
Subject: [PATCH] unsetenv: work around Solaris bug
unsetenv(name) only cleared the first instance, even if (ab)use of
putenv, or assignment to environ, included duplicates of name.
* m4/setenv.m4 (gl_FUNC_UNSETENV): Check for bug.
* lib/unsetenv.c (rpl_unsetenv): Work around it.
Reported by Jim Meyering.
Signed-off-by: Eric Blake <address@hidden>
---
ChangeLog | 5 +++++
lib/unsetenv.c | 5 +++--
m4/setenv.m4 | 23 ++++++++++++++++++++++-
3 files changed, 30 insertions(+), 3 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index e417934..4dbb0d3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
2009-11-17 Eric Blake <address@hidden>
+ unsetenv: work around Solaris bug
+ * m4/setenv.m4 (gl_FUNC_UNSETENV): Check for bug.
+ * lib/unsetenv.c (rpl_unsetenv): Work around it.
+ Reported by Jim Meyering.
+
vasnprintf: avoid compiler warnings
* lib/vasnprintf.c (VASNPRINTF): Avoid shadowing our own local
variables.
diff --git a/lib/unsetenv.c b/lib/unsetenv.c
index 7567011..21fb199 100644
--- a/lib/unsetenv.c
+++ b/lib/unsetenv.c
@@ -105,10 +105,11 @@ rpl_unsetenv (const char *name)
errno = EINVAL;
return -1;
}
+ while (getenv (name))
# if !VOID_UNSETENV
- result =
+ result =
# endif
- unsetenv (name);
+ unsetenv (name);
return result;
}
diff --git a/m4/setenv.m4 b/m4/setenv.m4
index ca146d2..a5df034 100644
--- a/m4/setenv.m4
+++ b/m4/setenv.m4
@@ -1,4 +1,4 @@
-# setenv.m4 serial 12
+# setenv.m4 serial 13
dnl Copyright (C) 2001-2004, 2006-2009 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
@@ -50,6 +50,7 @@ AC_DEFUN([gl_FUNC_UNSETENV],
AC_LIBOBJ([unsetenv])
gl_PREREQ_UNSETENV
else
+ dnl Some BSDs return void, failing to do error checking.
AC_CACHE_CHECK([for unsetenv() return type], [gt_cv_func_unsetenv_ret],
[AC_TRY_COMPILE([#include <stdlib.h>
extern
@@ -68,6 +69,26 @@ int unsetenv();
REPLACE_UNSETENV=1
AC_LIBOBJ([unsetenv])
fi
+
+ dnl Solaris 10 unsetenv does not remove all copies of a name.
+ AC_CACHE_CHECK([whether unsetenv works on duplicates],
+ [gl_cv_func_unsetenv_works],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+ #include <stdlib.h>
+ ]], [[
+ char entry[] = "b=2";
+ if (putenv ("a=1")) return 1;
+ if (putenv (entry)) return 2;
+ entry[0] = 'a';
+ unsetenv ("a");
+ if (getenv ("a")) return 3;
+ ]])],
+ [gl_cv_func_unsetenv_works=yes], [gl_cv_func_unsetenv_works=no],
+ [gl_cv_func_unsetenv_works="guessing no"])])
+ if test "$gl_cv_func_unsetenv_works" != yes; then
+ REPLACE_UNSETENV=1
+ AC_LIBOBJ([unsetenv])
+ fi
fi
])
--
1.6.5.rc1