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:29 PM, Eric Blake wrote:
> On 02/09/2011 05:17 PM, Eric Blake wrote:
>> Changes in v2: more documentation, fix the signature, change the default
>> when no feature macros are defined, don't overwrite buf if n is too
>> small, guarantee NUL termination in POSIX variant
>
> Shoot - I missed another POSIX requirement:
>
> "The implementation shall behave as if no function defined in this
> volume of POSIX.1-2008 calls strerror( )."
>
> That is, strerror_r() cannot call strerror() (but we _can_ have a helper
> method that both strerror() and strerror_r() call).
>
> The POSIX requirement means that someone can replace strerror() with
> their own link, but doing so won't affect the behavior of strerror_r().
> Is this something that I should worry about and clean up in a followup
> patch? Or is it too much of a corner case to bother with?
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."
That is:
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main (void) {
char *err = strerror(1000);
printf("%s", err);
errno = 2000;
peror("hi");
printf("%s", err);
return 0;
}
should result in the first and last lines being the same; but in the
broken case would result in the perror() corrupting the buffer.
Newlib is immune to observing that scenario (unless you provide a
non-standard _user_strerror hook), given that its implementation returns
distinct pointers for all possible errors rather than copying the result
into a common buffer and returning that buffer, and does not do any
formatting of out-of-range values.
But cygwin violates this, since it overrides newlib's strerror() to
format out-of-range numbers into a common reentrant data location, but
uses newlib's perror() which overwrites this location.
--
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] |