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]

Re: strerror_r questions


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]