summaryrefslogtreecommitdiff
path: root/lib/strerror_r.c
diff options
context:
space:
mode:
authorEric Blake <eblake@redhat.com>2011-05-23 21:05:07 -0600
committerEric Blake <eblake@redhat.com>2011-05-24 13:42:46 -0600
commite67e250d98e9dc0177a564f2cbfa99330902fe9e (patch)
treeb4cce5ef0d28177cdd95ceb81ef7b1a3e96b5487 /lib/strerror_r.c
parent3a3fe58b91a00ba3cafd960a2e2355c842448e47 (diff)
downloadgnulib-e67e250d98e9dc0177a564f2cbfa99330902fe9e.tar.gz
strerror_r: fix Solaris test failures
Solaris 10 populates buf on EINVAL, but not on ERANGE. * lib/strerror_r.c (strerror_r): Partially populate buf on ERANGE failures. * doc/posix-functions/strerror_r.texi (strerror_r): Document this. Signed-off-by: Eric Blake <eblake@redhat.com>
Diffstat (limited to 'lib/strerror_r.c')
-rw-r--r--lib/strerror_r.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/lib/strerror_r.c b/lib/strerror_r.c
index 40ebc59814..f6ce8a3248 100644
--- a/lib/strerror_r.c
+++ b/lib/strerror_r.c
@@ -27,12 +27,16 @@
#include <errno.h>
-# if GNULIB_defined_ESOCK /* native Windows platforms */
-# if HAVE_WINSOCK2_H
-# include <winsock2.h>
-# endif
+#if GNULIB_defined_ESOCK /* native Windows platforms */
+# if HAVE_WINSOCK2_H
+# include <winsock2.h>
# endif
+#endif
+/* Reasonable buffer size that should never trigger ERANGE; if this
+ proves too small, we intentionally abort(), to remind us to fix
+ this value as well as strerror-impl.h. */
+#define STACKBUF_LEN 256
#if (__GLIBC__ >= 2 || defined __UCLIBC__ || defined __CYGWIN__) && HAVE___XPG_STRERROR_R /* glibc >= 2.3.4, cygwin >= 1.7.9 */
@@ -483,7 +487,18 @@ strerror_r (int errnum, char *buf, size_t buflen)
ret = strerror_r (errnum, buf, buflen);
}
# else
+ /* Solaris 10 does not populate buf on ERANGE. */
ret = strerror_r (errnum, buf, buflen);
+ if (ret == ERANGE && !*buf)
+ {
+ char stackbuf[STACKBUF_LEN];
+
+ /* strerror-impl.h is also affected if our choice of stackbuf
+ size is not large enough. */
+ if (strerror_r (errnum, stackbuf, sizeof stackbuf) == ERANGE)
+ abort ();
+ safe_copy (buf, buflen, stackbuf);
+ }
# endif
/* Some old implementations may return (-1, EINVAL) instead of EINVAL. */