changeset 14879:7900fd3c88e4

strerror: work around FreeBSD bug Breaking strerror away from strerror_r re-exposed the FreeBSD strerror(0) bug. * lib/strerror.c (strerror): Special case 0. Reported by Bruno Haible. Signed-off-by: Eric Blake <eblake@redhat.com>
author Eric Blake <eblake@redhat.com>
date Mon, 06 Jun 2011 15:16:26 -0600
parents 293a9a1292a9
children 608708e78fec
files ChangeLog lib/strerror.c
diffstat 2 files changed, 17 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2011-06-06  Eric Blake  <eblake@redhat.com>
 
+	strerror: work around FreeBSD bug
+	* lib/strerror.c (strerror): Special case 0.
+	Reported by Bruno Haible.
+
 	strerror-override: avoid bloating errno module
 	* modules/errno (Files, configure.ac): Move replacement strings...
 	* modules/strerror-override: ...to new module.
--- a/lib/strerror.c
+++ b/lib/strerror.c
@@ -45,10 +45,22 @@
   if (msg)
     return (char *) msg;
 
+  /* FreeBSD rejects 0; see http://austingroupbugs.net/view.php?id=382.  */
+  if (n)
+    msg = strerror (n);
+  else
+    {
+      int saved_errno = errno;
+      errno = 0;
+      msg = strerror (n);
+      if (errno)
+        msg = "Success";
+      errno = saved_errno;
+    }
+
   /* Our strerror_r implementation might use the system's strerror
      buffer, so all other clients of strerror have to see the error
      copied into a buffer that we manage.  */
-  msg = strerror (n);
   if (!msg || !*msg)
     {
       static char const fmt[] = "Unknown error %d";