From 41d42744e7a191342b71e4fe21517679b6a02a5e Mon Sep 17 00:00:00 2001 From: Eric Blake 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 --- ChangeLog | 5 +++++ lib/unsetenv.c | 5 +++-- m4/setenv.m4 | 23 ++++++++++++++++++++++- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index e4179347a1..4dbb0d35ab 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2009-11-17 Eric Blake + 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 75670119de..21fb1999de 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 ca146d2c0b..a5df034aa6 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 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 + ]], [[ + 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 ]) -- 2.30.2