[pulseaudio-discuss] [PATCH 09/10] Implement some functions for win32

Maarten Bosmans mkbosmans at gmail.com
Tue Jan 11 02:51:00 PST 2011


2011/1/11 Colin Guthrie <gmane at colin.guthr.ie>:
>> void pa_set_env(const char *key, const char *value) {
>>     pa_assert(key);
>>     pa_assert(value);
>>
>>     /* This is not thread-safe */
>>
>>     putenv(pa_sprintf_malloc("%s=%s", key, value));
>> }
>
> Hmm, that looks wrong too on first glance, but with a little digging
> (well, man putenv!):
>
>       The  libc4  and  libc5  and  glibc 2.1.2 versions conform to
> SUSv2: the
>       pointer string given to putenv() is used.  In particular,  this
> string
>       becomes  part  of  the  environment;  changing it later will
> change the
>       environment.  (Thus, it is an error is to call putenv() with  an
>  auto‐
>       matic  variable  as the argument, then return from the calling
> function
>       while string  is  still  part  of  the  environment.)   However,
>  glibc
>       2.0-2.1.1  differs: a copy of the string is used.  On the one
> hand this
>       causes a memory leak, and on the other hand it  violates  SUSv2.
>  This
>       has been fixed in glibc 2.1.2.
>
>
> So I guess this was correct back in the olden days but perhaps now we
> should be free'ing it. I'd rather have someone who knows such things
> confirm this first tho' as I'm not really sure!!

Well, on POSIX, setenv would be a better replacement I guess. No
ambiguity about whether to free the string or not.

After a bit of digging, I found that on Windows there is an equivalent:
errno_t _putenv_s(const char *name, const char *value );
That is setenv, without the overwrite parameter.

>> Is that wrong to? What fix would you suggest?
>
> Well, if it turns out correct to do so:
>
> char *t;
> putenv(t = pa_sprintf_malloc("%s=", s));
> pa_xfree(t);

It turns out that Windows actually copies the string, but there is no
API guarantee that it does. Anyway, point is moot considering the
above.

> But I will ask some folk about this as I'm not certain.
>
> FWIW, further up in that file, there is some WIN32 code that uses
> _putenv() with a stack variable. I'm not really sure of the differences
> between putenv() and _putenv() tho' :s

No difference:
http://msdn.microsoft.com/en-us/library/ms235321(v=vs.80).aspx

>
> Col
>

I'll prepare a new patch series with all your points adressed.

Maarten



More information about the pulseaudio-discuss mailing list