Making getenv more multi-threading--robust?

Stephan Bergmann sbergman@redhat.com
Wed Sep 19 08:40:00 GMT 2012


On 09/13/2012 11:06 PM, KOSAKI Motohiro wrote:
>> So I think it's a reasonable change.
>> File a bug in bugzilla about it first.
>
> Or reopen 5069 or 4887?
> They seems to discuss very similar or the same issue.

Thanks for digging these out.  So it looks like I am at least the third 
person to come up with what is effectively the same (somewhat obvious, 
anyway) patch for this (after 
<http://sources.redhat.com/ml/libc-alpha/2004-02/msg00165.html> "getenv 
not thread safe" by Michael Eager in 2004 and 
<http://sourceware.org/bugzilla/show_bug.cgi?id=5069#c0> "env thread 
safety problem" by zhangxiliang in 2007).  Given that previous patches 
have been turned down in no uncertain terms (cf. 
<http://sourceware.org/bugzilla/show_bug.cgi?id=5069#c10>), I wonder if 
it is actually worth it to come up now with effectively the same patch 
again?

If it should be worth it after all, I guess it is probably best to 
reopen 5069 and start with the patch provided there.  After all, it uses 
an rwlock to potentially improve performance for getenv-intensive 
applications (or do you have an even better approach in mind, Torvald?). 
  Also, my understanding is that it already covers the deadlock issue 
discussed there alright, but my understanding may well be wrong there.

[My (potentially naive) personal opinion is that "Modifications of 
environment variables are not allowed in multi-threaded programs." 
(manual/startup.texi) and "Any
program that uses putenv or setenv makes itself not thread safe." 
(<http://sourceware.org/bugzilla/show_bug.cgi?id=5069#c10>):

- For one are unfortunate deviations from SUSv4: 
<www.opengroup.org/onlinepubs/9699919799/> "The Open Group Base 
Specifications Issue 7" merely states that each of getenv, putenv, 
setenv, unsetenv need not be thread-safe (where it defines "thread-safe" 
as "a function that may be safely invoked concurrently by multiple 
threads," but, granted, that should likely be interpreted here as not 
pertaining only to calls of the individual functions, but to any 
combinations of calls to them), and the C Standard requires "The 
implementation shall behave as if no library function calls the getenv 
function."  However, the status quo for glibc is that even a 
multi-threaded program only calling setenv and malloc (which is one of 
those "library functions" covered by the C Standard, and which 
internally calls getenv in glibc) is broken.

- And for another are in contrast with the existing locking in 
stdlib/setenv.c.]

Stephan



More information about the Libc-alpha mailing list