* lib/strerror_r.c (strerror_r): Filter out buflen of 1 up front. Signed-off-by: Eric Blake <ebl...@redhat.com> ---
ChangeLog | 3 +++ lib/strerror_r.c | 30 +++++++++--------------------- 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/ChangeLog b/ChangeLog index 598238f..bda43a6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2011-05-20 Eric Blake <ebl...@redhat.com> + strerror_r: simplify AIX code. + * lib/strerror_r.c (strerror_r): Filter out buflen of 1 up front. + test-perror: avoid spurious failure on FreeBSD * modules/perror-tests (Depends-on): Add strerror, now that strerror_r no longer pulls it in. diff --git a/lib/strerror_r.c b/lib/strerror_r.c index 30dcd44..2144fc6 100644 --- a/lib/strerror_r.c +++ b/lib/strerror_r.c @@ -95,6 +95,15 @@ int strerror_r (int errnum, char *buf, size_t buflen) #undef strerror_r { + /* Filter this out now, so that rest of this replacement knows that + there is room for a non-empty message and trailing NUL. */ + if (buflen <= 1) + { + if (buflen) + *buf = 0; + return ERANGE; + } + #if GNULIB_defined_ETXTBSY \ || GNULIB_defined_ESOCK \ || GNULIB_defined_ENOMSG \ @@ -492,27 +501,6 @@ strerror_r (int errnum, char *buf, size_t buflen) ret = strerror_r (errnum, buf, buflen); # endif -# ifdef _AIX - /* On AIX 6.1, strerror_r returns -1 and sets errno to EINVAL - if buflen <= 1. */ - if (ret < 0 && errno == EINVAL && buflen <= 1) - { - /* Retry with a larger buffer. */ - char largerbuf[10]; - ret = strerror_r (errnum, largerbuf, sizeof (largerbuf)); - if (ret < 0 && errno == EINVAL) - { - /* errnum was out of range. */ - ret = EINVAL; - } - else - { - /* buf was too small. */ - ret = ERANGE; - } - } -# endif - /* Some old implementations may return (-1, EINVAL) instead of EINVAL. */ if (ret < 0) ret = errno; -- 1.7.4.4