1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
From da27118157c2942d7652138b8d8b0056fc8f872f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cl=C3=A9ment=20Vasseur?= <clement.vasseur@gmail.com>
Date: Wed, 9 Jul 2014 14:34:18 +0200
Subject: [PATCH] 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.
---
src/misc/syslog.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/misc/syslog.c b/src/misc/syslog.c
index 1cd61ce..57f1d75 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;
--
2.0.2
|