bug-gnulib
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]