This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
On 02/09/2011 05:43 PM, Eric Blake wrote: >> Shoot - I missed another POSIX requirement: >> >> "The implementation shall behave as if no function defined in this >> volume of POSIX.1-2008 calls strerror( )." >> > Reading further, POSIX states the reason for that requirement: > > "Historically in some implementations, calls to perror( ) would > overwrite the string that the pointer returned by strerror( ) points to." Proposal: would anyone object if I changed the semantics of _user_strerror? Right now, it is documented as: char *_user_strerror(int errnum); where errnum is unhandled by newlib proper, and the result is NULL if the hook also declines handling, or an alternate string used directly (therefore, one can write _user_strerror to provide "unknown error %d" formatting into thread-safe storage). However, this means that use of _user_strerror either renders perror() non-compliant, since _user_strerror reuses the same storage on each call, or that it is a memory leak with _user_strerror returning new storage on each call. I'm proposing that we change the signature of the hook to: char *_user_strerror(int errnum, int from_strerror) where the from_strerror argument is 0 for all callers except strerror(). I'm also proposing adding _strerror(int errnum, int strerror) which all other newlib clients (such as perror()) will call as _strerror(err,0), but strerror() will call as _strerror(err,1). ABI wise, existing implementations of _user_strerror that take one argument will ignore the second argument, so it is a backward-compatible API change. Meanwhile, this would allow others to implement _user_strerror in such a way that keeps the rest of newlib POSIX-compliant - returning two different banks of storage depending on the from_strerror argument, so that no other function overwrites the bank of storage returned by strerror(); it would also allow strerror() to set errno to EINVAL via _user_strerror while leaving errno untouched for strerror_r. -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org
Attachment:
signature.asc
Description: OpenPGP digital signature
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |