At Tue, 25 Nov 2003 23:45:48 +1100, Ken Foskey wrote:
> I am getting this error:
>
> process.c:1018: warning: passing arg 1 of `putenv' discards qualifiers
> from pointer target type
>
> It turns out that I am sending a "const" string to putenv which is
> defined:
>
> ./stdlib.h:extern int putenv (char *__string) __THROW;
>
> This discards the "constness" of the string.
>
> Then I find this:
>
> http://sources.redhat.com/ml/libc-hacker/1999-08/msg00008.html
>
> which implies that it was const ages ago.
>
> Should I raise this as a bug?
quoting from putenv(3) (from manpages-dev.deb 1.60-3):
NOTES
The putenv() function is not required to be reentrant, and the one in
libc4, libc5 and glibc2.0 is not, but the glibc2.1 version is.
Description for libc4, libc5, glibc: If the argument string is of the
form name, and does not contain an `=' character, then the variable
name is removed from the environment. If putenv() has to allocate a
new array environ, and the previous array was also allocated by
putenv(), then it will be freed. In no case will the old storage asso-
ciated to the environment variable itself be freed.
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 glibc2.1.2.
The BSD4.4 version, like glibc 2.0, uses a copy.
SUSv2 removes the `const' from the prototype, and so does glibc 2.1.3.
--
- Gus
--
SLUG - Sydney Linux User's Group - http://slug.org.au/
More Info: http://lists.slug.org.au/listinfo/slug