aboutsummaryrefslogtreecommitdiffstats
path: root/main/musl/0003-handle-loss-of-syslog-socket-connection.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/musl/0003-handle-loss-of-syslog-socket-connection.patch')
-rw-r--r--main/musl/0003-handle-loss-of-syslog-socket-connection.patch77
1 files changed, 77 insertions, 0 deletions
diff --git a/main/musl/0003-handle-loss-of-syslog-socket-connection.patch b/main/musl/0003-handle-loss-of-syslog-socket-connection.patch
new file mode 100644
index 0000000000..d33c2ff048
--- /dev/null
+++ b/main/musl/0003-handle-loss-of-syslog-socket-connection.patch
@@ -0,0 +1,77 @@
+From 0f9c2666aca95eb98eb0ef4f4d8d1473c8ce3fa0 Mon Sep 17 00:00:00 2001
+From: Rich Felker <dalias@aerifal.cx>
+Date: Thu, 9 Jul 2015 18:36:02 +0000
+Subject: [PATCH] handle loss of syslog socket connection
+
+when traditional syslogd implementations are restarted, the old server
+socket ceases to exist and a new unix socket with the same pathname is
+created. when this happens, the default destination address associated
+with the client socket via connect is no longer valid, and attempts to
+send produce errors. this happens despite the socket being datagram
+type, and is in contrast to the behavior that would be seen with an IP
+datagram (UDP) socket.
+
+in order to avoid a situation where the application is unable to send
+further syslog messages without calling closelog, this patch makes
+syslog attempt to reconnect the socket when send returns an error
+indicating a lost connection.
+
+additionally, initial failure to connect the socket no longer results
+in the socket being closed. this ensures that an application which
+calls openlog to reserve the socket file descriptor will not run into
+a situation where transient connection failure (e.g. due to syslogd
+restart) prevents fd reservation. however, applications which may be
+unable to connect the socket later (e.g. due to chroot, restricted
+permissions, seccomp, etc.) will still fail to log if the syslog
+socket cannot be connected at openlog time or if it has to be
+reconnected later.
+---
+ src/misc/syslog.c | 18 +++++++++++-------
+ 1 file changed, 11 insertions(+), 7 deletions(-)
+
+diff --git a/src/misc/syslog.c b/src/misc/syslog.c
+index e026f9b..9dd1ddb 100644
+--- a/src/misc/syslog.c
++++ b/src/misc/syslog.c
+@@ -48,12 +48,8 @@ void closelog(void)
+
+ static void __openlog()
+ {
+- int fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0);
+- if (fd < 0) return;
+- if (connect(fd, (void *)&log_addr, sizeof log_addr) < 0)
+- close(fd);
+- else
+- log_fd = fd;
++ log_fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0);
++ if (log_fd >= 0) connect(log_fd, (void *)&log_addr, sizeof log_addr);
+ }
+
+ void openlog(const char *ident, int opt, int facility)
+@@ -78,6 +74,11 @@ void openlog(const char *ident, int opt, int facility)
+ pthread_setcancelstate(cs, 0);
+ }
+
++static int is_lost_conn(int e)
++{
++ return e==ECONNREFUSED || e==ECONNRESET || e==ENOTCONN || e==EPIPE;
++}
++
+ static void _vsyslog(int priority, const char *message, va_list ap)
+ {
+ char timebuf[16];
+@@ -107,7 +108,10 @@ static void _vsyslog(int priority, const char *message, va_list ap)
+ if (l2 >= sizeof buf - l) l = sizeof buf - 1;
+ else l += l2;
+ if (buf[l-1] != '\n') buf[l++] = '\n';
+- if (send(log_fd, buf, l, 0) < 0 && (log_opt & LOG_CONS)) {
++ if (send(log_fd, buf, l, 0) < 0 && (!is_lost_conn(errno)
++ || connect(log_fd, (void *)&log_addr, sizeof log_addr) < 0
++ || send(log_fd, buf, l, 0) < 0)
++ && (log_opt & LOG_CONS)) {
+ fd = open("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC);
+ if (fd >= 0) {
+ dprintf(fd, "%.*s", l-hlen, buf+hlen);
+--
+2.4.6
+