[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 3/3] strerror_r: fix AIX test failures
From: |
Eric Blake |
Subject: |
[PATCH 3/3] strerror_r: fix AIX test failures |
Date: |
Tue, 24 May 2011 13:47:32 -0600 |
Already documented as an AIX limitation.
* lib/strerror_r.c (strerror_r): Convert silent truncation to
ERANGE failure.
Signed-off-by: Eric Blake <address@hidden>
---
ChangeLog | 4 ++++
lib/strerror_r.c | 20 +++++++++++++++++++-
2 files changed, 23 insertions(+), 1 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 80e9369..2f31f7d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
2011-05-24 Eric Blake <address@hidden>
+ strerror_r: fix AIX test failures
+ * lib/strerror_r.c (strerror_r): Convert silent truncation to
+ ERANGE failure.
+
strerror_r: fix Solaris test failures
* lib/strerror_r.c (strerror_r): Partially populate buf on ERANGE
failures.
diff --git a/lib/strerror_r.c b/lib/strerror_r.c
index f6ce8a3..034c22e 100644
--- a/lib/strerror_r.c
+++ b/lib/strerror_r.c
@@ -473,7 +473,8 @@ strerror_r (int errnum, char *buf, size_t buflen)
buflen = INT_MAX;
# ifdef __hpux
- /* On HP-UX 11.31, strerror_r always fails when buflen < 80. */
+ /* On HP-UX 11.31, strerror_r always fails when buflen < 80; it
+ also fails to change buf on EINVAL. */
{
char stackbuf[80];
@@ -501,6 +502,23 @@ strerror_r (int errnum, char *buf, size_t buflen)
}
# endif
+# ifdef _AIX
+ /* AIX returns 0 rather than ERANGE when truncating strings; try
+ again until we are sure we got the entire string. */
+ if (!ret && strlen (buf) == buflen - 1)
+ {
+ char stackbuf[STACKBUF_LEN];
+ size_t len;
+ strerror_r (errnum, stackbuf, sizeof stackbuf);
+ len = strlen (stackbuf);
+ /* stackbuf should have been large enough. */
+ if (len + 1 == sizeof stackbuf)
+ abort ();
+ if (buflen <= len)
+ ret = ERANGE;
+ }
+# endif
+
/* Some old implementations may return (-1, EINVAL) instead of EINVAL. */
if (ret < 0)
ret = errno;
--
1.7.4.4