+2024-06-05 Bruno Haible <bruno@clisp.org>
+
+ putenv: Improve comments.
+ * lib/putenv.c (_unsetenv, putenv): Improve comments regarding native
+ Windows.
+
2024-06-04 Collin Funk <collin.funk1@gmail.com>
boot-time, readutmp: Fix missing MinGW include (regr. 2024-05-24).
_unsetenv (const char *name)
{
size_t len;
-#if !HAVE_DECL__PUTENV
- char **ep;
-#endif
if (name == NULL || *name == '\0' || strchr (name, '=') != NULL)
{
len = strlen (name);
-#if HAVE_DECL__PUTENV
+#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.
+
+ The way to remove an environment variable is to pass to _putenv a string
+ of the form "NAME=". (NB: This is a different convention than with glibc
+ putenv, which expects a string of the form "NAME"!) */
{
int putenv_result;
char *name_ = malloc (len + 2);
name_[len] = '=';
name_[len + 1] = 0;
putenv_result = _putenv (name_);
+ /* In this particular case it is OK to free() the argument passed to
+ _putenv. */
free (name_);
return putenv_result;
}
LOCK;
- ep = environ;
+ char **ep = environ;
while (*ep != NULL)
if (!strncmp (*ep, name, len) && (*ep)[len] == '=')
{
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