On Wed, 19 Oct 2016 09:11:36 -0600, "Todd C. Miller" wrote:

> Currently, syslog_r() avoids using strerror() since it is not
> reentrant.  We have a reentrant strerror_r() so let's use it.

Since strerror_r() always fills in the buffer there is no need to
check the return value.  If saved_errno is not a valid error number,
strerror_r() will use "Unknown error: %d".

 - todd

Index: lib/libc/gen/syslog_r.c
===================================================================
RCS file: /cvs/src/lib/libc/gen/syslog_r.c,v
retrieving revision 1.15
diff -u -p -u -r1.15 syslog_r.c
--- lib/libc/gen/syslog_r.c     27 Mar 2016 16:28:56 -0000      1.15
+++ lib/libc/gen/syslog_r.c     19 Oct 2016 15:48:41 -0000
@@ -138,18 +138,13 @@ __vsyslog_r(int pri, struct syslog_data 
                }
        }
 
-       /* strerror() is not reentrant */
-
        for (t = fmt_cpy, fmt_left = FMT_LEN; (ch = *fmt); ++fmt) {
                if (ch == '%' && fmt[1] == 'm') {
+                       char ebuf[NL_TEXTMAX];
+
                        ++fmt;
-                       if (reentrant) {
-                               prlen = snprintf(t, fmt_left, "Error %d",
-                                   saved_errno); 
-                       } else {
-                               prlen = snprintf(t, fmt_left, "%s",
-                                   strerror(saved_errno)); 
-                       }
+                       (void)strerror_r(saved_errno, ebuf, sizeof(ebuf));
+                       prlen = snprintf(t, fmt_left, "%s", ebuf);
                        if (prlen < 0)
                                prlen = 0;
                        if (prlen >= fmt_left)

Reply via email to