summaryrefslogtreecommitdiff
path: root/lib/strerror_r.c
diff options
context:
space:
mode:
authorEric Blake <eblake@redhat.com>2011-06-07 20:49:04 -0600
committerEric Blake <eblake@redhat.com>2011-06-08 06:50:35 -0600
commit79d4e75d8e14dee5d91f58413942fe875857d4f5 (patch)
tree8e57ed509fe06235828e08e4f49f871fdc43cd8e /lib/strerror_r.c
parent284602e2840830b0e25ec9069840f061f563cc23 (diff)
downloadgnulib-79d4e75d8e14dee5d91f58413942fe875857d4f5.tar.gz
strerror_r-posix: fix on MacOS
MacOS X 10.5 strerror(0) is "Unknown error: 0", which is not distinguished from "Unknown error: -1" for out-of-range. Worse, strerror_r(0,,) is "Undefined error: 0", although strerror_r for all other out-of-range values matches strerror. * m4/strerror.m4 (gl_FUNC_STRERROR): Flush out MacOS bug. * m4/strerror_r.m4 (gl_FUNC_STRERROR_R_WORKS): Likewise, and fix logic bug. * lib/strerror_r.c (strerror_r): Fix the bug. * lib/strerror.c (strerror): Likewise. * doc/posix-functions/strerror_r.texi (strerror_r): Document the problem. * doc/posix-functions/strerror.texi (strerror): Likewise. * doc/posix-functions/perror.texi (perror): Likewise. * tests/test-strerror.c (main): Enhance test. * tests/test-strerror_r.c (main): Likewise. Signed-off-by: Eric Blake <eblake@redhat.com>
Diffstat (limited to 'lib/strerror_r.c')
-rw-r--r--lib/strerror_r.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/lib/strerror_r.c b/lib/strerror_r.c
index d0c7be953e..46b47ed8c1 100644
--- a/lib/strerror_r.c
+++ b/lib/strerror_r.c
@@ -209,9 +209,16 @@ strerror_r (int errnum, char *buf, size_t buflen)
if (ret < 0)
ret = errno;
- /* FreeBSD rejects 0; see http://austingroupbugs.net/view.php?id=382. */
- if (errnum == 0 && ret == EINVAL)
- ret = safe_copy (buf, buflen, "Success");
+ /* FreeBSD rejects 0; see http://austingroupbugs.net/view.php?id=382.
+ MacOS X 10.5 strerror_r differs from the strerror string for 0. */
+ if (errnum == 0)
+ {
+# if defined __APPLE__ && defined __MACH__
+ ret = EINVAL;
+# endif
+ if (ret == EINVAL)
+ ret = safe_copy (buf, buflen, "Success");
+ }
#else /* USE_SYSTEM_STRERROR */