bug-gnulib
[Top][All Lists]
Advanced

[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


reply via email to

[Prev in Thread] Current Thread [Next in Thread]