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

Colin Guthrie gmane at colin.guthr.ie
Tue Jan 11 01:44:59 PST 2011

'Twas brillig, and Maarten Bosmans at 11/01/11 06:16 did gyre and gimble:
> Thanks for the review
> 2011/1/11 Colin Guthrie <gmane at colin.guthr.ie>:
>> 'Twas brillig, and Maarten Bosmans at 06/01/11 01:39 did gyre and gimble:
>>> @@ -2565,7 +2569,11 @@ void pa_unset_env_recorded(void) {
>>>          if (!s)
>>>              break;
>>> +#ifdef OS_IS_WIN32
>>> +        putenv(pa_sprintf_malloc("%s=", s));
>>> +#else
>>>          unsetenv(s);
>>> +#endif
>>>          pa_xfree(s);
>>>      }
>>>  }
>> This looks leaky....
> Yes, I thought so to, but I'm not really that proficient in C (getting
> there though). The pa_sprintf_malloc I just copied from the pa_set_env
> definition, a couple of lines earlier in core-util.c:
> 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
       becomes  part  of  the  environment;  changing it later will
change the
       environment.  (Thus, it is an error is to call putenv() with  an
       matic  variable  as the argument, then return from the calling
       while string  is  still  part  of  the  environment.)   However,
       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.
       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!!

> 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));

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



Colin Guthrie

Day Job:
  Tribalogic Limited [http://www.tribalogic.net/]
Open Source:
  Mageia Contributor [http://www.mageia.org/]
  PulseAudio Hacker [http://www.pulseaudio.org/]
  Trac Hacker [http://trac.edgewall.org/]

More information about the pulseaudio-discuss mailing list