fix the %m specifier in syslog
authorClément Vasseur <clement.vasseur@gmail.com>
Wed, 9 Jul 2014 12:34:18 +0000 (14:34 +0200)
committerRich Felker <dalias@aerifal.cx>
Mon, 28 Jul 2014 04:27:59 +0000 (00:27 -0400)
errno must be saved upon vsyslog entry, otherwise its value could be
changed by some libc function before reaching the %m handler in
vsnprintf.

(cherry picked from commit da27118157c2942d7652138b8d8b0056fc8f872f)

src/misc/syslog.c

index 1cd61ce444b2663d3f46f667f1976cb0a9479fd9..57f1d75cbd12cf121715e62e41d93cf46d2c57ed 100644 (file)
@@ -7,6 +7,7 @@
 #include <signal.h>
 #include <string.h>
 #include <pthread.h>
+#include <errno.h>
 #include "libc.h"
 #include "atomic.h"
 
@@ -76,6 +77,7 @@ static void _vsyslog(int priority, const char *message, va_list ap)
        time_t now;
        struct tm tm;
        char buf[256];
+       int errno_save = errno;
        int pid;
        int l, l2;
 
@@ -93,6 +95,7 @@ static void _vsyslog(int priority, const char *message, va_list ap)
        pid = (log_opt & LOG_PID) ? getpid() : 0;
        l = snprintf(buf, sizeof buf, "<%d>%s %s%s%.0d%s: ",
                priority, timebuf, log_ident, "["+!pid, pid, "]"+!pid);
+       errno = errno_save;
        l2 = vsnprintf(buf+l, sizeof buf - l, message, ap);
        if (l2 >= 0) {
                if (l2 >= sizeof buf - l) l = sizeof buf - 1;