[krbdev.mit.edu #2636] replace all calls to getenv()/setenv() with Get/SetEnvironmentVariable on Windows

Jeffrey Altman via RT rt-comment at krbdev.mit.edu
Thu Sep 21 00:10:26 EDT 2006


I would like to bring this topic back to the foreground.
As a refresher, the Kerberos libraries and applications make
extensive use of getenv() and setenv() for manipulating the
environment.  On Windows this is problem because the getenv
and setenv CRT functions do not access the real environment
of the application.  Instead they manipulate a private
implementation of environ[].

There are several mechanisms via which we can address this
issue.  Here is a proposal for implementation:

We leave the POSIX systems alone and for Windows implement
new support functions:

       const char * win32_getenv(const char * var)
       int win32_setenv(const char *var, const char *value)

and a macro

	free_envstr(str)

    win32_getenv() would be implemented in terms of the Win32
    GetEnvironmentVariable API.  This API can be called in two
    ways.  First it can be used to obtain the required buffer
    size and secondly to obtain the value in a provided buffer.
    win32_getenv() would determine the appropriate buffer size,
    allocate the buffer with malloc(), and then obtain the value
    and return the buffer.  This buffer would then need to be
    freed by the caller.

   win32_setenv() would take a variable name and value and
   pass them to the SetEnvironmentVariable API

On Windows, the free_envstr macro would call an appropriate
function to free the allocated memory.

On POSIX systems, the free_envstr macro would be a no-op.

What do people think?

Jeffrey Altman





More information about the krb5-bugs mailing list