diff options
author | Eric Blake <eblake@redhat.com> | 2011-05-23 21:05:07 -0600 |
---|---|---|
committer | Eric Blake <eblake@redhat.com> | 2011-05-24 13:42:46 -0600 |
commit | e67e250d98e9dc0177a564f2cbfa99330902fe9e (patch) | |
tree | b4cce5ef0d28177cdd95ceb81ef7b1a3e96b5487 /lib/strerror_r.c | |
parent | 3a3fe58b91a00ba3cafd960a2e2355c842448e47 (diff) | |
download | gnulib-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.c | 23 |
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. */ |