diff options
author | Clément Vasseur <clement.vasseur@gmail.com> | 2014-07-09 14:34:18 +0200 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2014-07-28 00:27:59 -0400 |
commit | bdd4c57e2588bf3cf273bcc3ff04a7584aa3391c (patch) | |
tree | 6946d486801c91822504da3e660edb7d29b6a838 /src/misc | |
parent | 147cd60d4da59b99963e480c811f746c853bd589 (diff) | |
download | musl-bdd4c57e2588bf3cf273bcc3ff04a7584aa3391c.tar.gz musl-bdd4c57e2588bf3cf273bcc3ff04a7584aa3391c.tar.bz2 musl-bdd4c57e2588bf3cf273bcc3ff04a7584aa3391c.tar.xz musl-bdd4c57e2588bf3cf273bcc3ff04a7584aa3391c.zip |
fix the %m specifier in syslog
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)
Diffstat (limited to 'src/misc')
-rw-r--r-- | src/misc/syslog.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/src/misc/syslog.c b/src/misc/syslog.c index 1cd61ce4..57f1d75c 100644 --- a/src/misc/syslog.c +++ b/src/misc/syslog.c @@ -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; |