diff options
Diffstat (limited to 'tests/putenv.c')
| -rw-r--r-- | tests/putenv.c | 71 | 
1 files changed, 13 insertions, 58 deletions
| diff --git a/tests/putenv.c b/tests/putenv.c index 2ab6f248..d3084c9e 100644 --- a/tests/putenv.c +++ b/tests/putenv.c @@ -64,59 +64,6 @@ __libc_lock_define_initialized (static, envlock)  # define SetEnvironmentVariable SetEnvironmentVariableA  #endif -static int -_unsetenv (const char *name) -{ -  size_t len; -#if !HAVE_DECL__PUTENV -  char **ep; -#endif - -  if (name == NULL || *name == '\0' || strchr (name, '=') != NULL) -    { -      __set_errno (EINVAL); -      return -1; -    } - -  len = strlen (name); - -#if HAVE_DECL__PUTENV -  { -    int putenv_result; -    char *name_ = malloc (len + 2); -    memcpy (name_, name, len); -    name_[len] = '='; -    name_[len + 1] = 0; -    putenv_result = _putenv (name_); -    free (name_); -    return putenv_result; -  } -#else - -  LOCK; - -  ep = environ; -  while (*ep != NULL) -    if (!strncmp (*ep, name, len) && (*ep)[len] == '=') -      { -        /* Found it.  Remove this pointer by moving later ones back.  */ -        char **dp = ep; - -        do -          dp[0] = dp[1]; -        while (*dp++); -        /* Continue the loop in case NAME appears again.  */ -      } -    else -      ++ep; - -  UNLOCK; - -  return 0; -#endif -} - -  /* Put STRING, which is of the form "NAME=VALUE", in the environment.     If STRING contains no '=', then remove STRING from the environment.  */  int @@ -128,13 +75,21 @@ putenv (char *string)    if (name_end == NULL)      {        /* Remove the variable from the environment.  */ -      return _unsetenv (string); +      return unsetenv (string);      } -#if HAVE_DECL__PUTENV -  /* Rely on _putenv to allocate the new environment.  If other -     parts of the application use _putenv, the !HAVE_DECL__PUTENV code -     would fight over who owns the environ vector, causing a crash.  */ +#if HAVE_DECL__PUTENV /* native Windows */ +  /* The Microsoft documentation +     <https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/putenv-wputenv> +     says: +       "Don't change an environment entry directly: instead, +        use _putenv or _wputenv to change it." +     Note: Microsoft's _putenv updates not only the contents of _environ but +     also the contents of _wenviron, so that both are in kept in sync. + +     If we didn't follow this advice, our code and other parts of the +     application (that use _putenv) would fight over who owns the environ vector +     and thus cause a crash.  */    if (name_end[1])      return _putenv (string);    else | 
