strerror_r: avoid corrupting errno on Solaris
authorEric Blake <eblake@redhat.com>
Fri, 20 May 2011 23:45:13 +0000 (17:45 -0600)
committerEric Blake <eblake@redhat.com>
Fri, 20 May 2011 23:45:13 +0000 (17:45 -0600)
On Solaris, a non-zero return was also reflected into errno.
Leaving errno unchanged is a useful feature worth guaranteeing.

* m4/strerror_r.m4 (gl_FUNC_STRERROR_R): Check for Solaris behavior.
* doc/posix-functions/strerror_r.texi (strerror_r): Document it.

Signed-off-by: Eric Blake <eblake@redhat.com>
ChangeLog
doc/posix-functions/strerror_r.texi
m4/strerror_r.m4

index fafa86fbec5e60aca66cc8fdbc6da6a906dc63c7..bb0eeb416a28b7fd69d0ac5e5d69b82c2db35c4f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2011-05-20  Eric Blake  <eblake@redhat.com>
 
+       strerror_r: avoid corrupting errno on Solaris
+       * m4/strerror_r.m4 (gl_FUNC_STRERROR_R): Check for Solaris behavior.
+       * doc/posix-functions/strerror_r.texi (strerror_r): Document it.
+
        strerror_r: avoid compiler warning
        * m4/strerror_r.m4 (gl_FUNC_STRERROR_R): Don't return a char*.
 
index 9d6639edac4c79325d885c4eb6c22b11cb9fc300..35cee29baa45f49eda7a927a5520e1eaf019541c 100644 (file)
@@ -33,6 +33,9 @@ When this function fails, it returns -1 and sets @code{errno}, instead of
 returning the error number, on some platforms:
 glibc 2.12 with @code{-D_POSIX_C_SOURCE=200112L}, AIX 6.1, OSF/1 5.1.
 @item
+When this function fails, it corrupts @code{errno}, on some platforms:
+Solaris 10.
+@item
 This function does not support the error values that are specified by POSIX
 but not defined by the system, on some platforms:
 OpenBSD 4.0, OSF/1 5.1, NonStop Kernel, Cygwin 1.5.x.
index 13fb931a9b3d7a63aaaff2876cd24ab904401760..ddaf10f5263dff6da164c236896266290209f9bc 100644 (file)
@@ -1,4 +1,4 @@
-# strerror_r.m4 serial 7
+# strerror_r.m4 serial 8
 dnl Copyright (C) 2002, 2007-2011 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -42,6 +42,7 @@ AC_DEFUN([gl_FUNC_STRERROR_R],
         dnl HP-UX 11.31 strerror_r always fails when the buffer length argument
         dnl is less than 80.
         dnl FreeBSD 8.s strerror_r claims failure on 0
+        dnl Solaris 10 strerror_r corrupts errno on failure
         AC_CACHE_CHECK([whether strerror_r works],
           [gl_cv_func_strerror_r_works],
           [AC_RUN_IFELSE(
@@ -60,6 +61,11 @@ AC_DEFUN([gl_FUNC_STRERROR_R],
                     result |= 4;
                   if (errno)
                     result |= 8;
+                  errno = 0;
+                  if (strerror_r (-3, buf, sizeof buf) != 0)
+                    result |= 0x10;
+                  if (errno)
+                    result |= 0x20;
                   return result;
                 ]])],
              [gl_cv_func_strerror_r_works=yes],