Zbigniew Jędrzejewski-Szmek dd42fc
From b1fc5bc6e56e6b2abd5e1f0782654d22f1220dc5 Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek dd42fc
From: Daniel Mack <zonque@gmail.com>
Zbigniew Jędrzejewski-Szmek dd42fc
Date: Fri, 7 Mar 2014 14:43:59 +0100
Zbigniew Jędrzejewski-Szmek dd42fc
Subject: [PATCH] manager: flush memory stream before using the buffer
Zbigniew Jędrzejewski-Szmek dd42fc
Zbigniew Jędrzejewski-Szmek dd42fc
When the manager receives a SIGUSR2 signal, it opens a memory stream
Zbigniew Jędrzejewski-Szmek dd42fc
with open_memstream(), uses the returned file handle for logging, and
Zbigniew Jędrzejewski-Szmek dd42fc
dumps the logged content with log_dump().
Zbigniew Jędrzejewski-Szmek dd42fc
Zbigniew Jędrzejewski-Szmek dd42fc
However, the char* buffer is only safe to use after the file handle has
Zbigniew Jędrzejewski-Szmek dd42fc
been flushed with fflush, as the man pages states:
Zbigniew Jędrzejewski-Szmek dd42fc
Zbigniew Jędrzejewski-Szmek dd42fc
  When the stream is closed (fclose(3)) or flushed (fflush(3)), the
Zbigniew Jędrzejewski-Szmek dd42fc
  locations pointed to by ptr and sizeloc are updated to contain,
Zbigniew Jędrzejewski-Szmek dd42fc
  respectively, a pointer to the buffer and the current size of  the
Zbigniew Jędrzejewski-Szmek dd42fc
  buffer.
Zbigniew Jędrzejewski-Szmek dd42fc
  These values remain valid only as long as the caller performs no
Zbigniew Jędrzejewski-Szmek dd42fc
  further output on the stream.  If further output is performed, then the
Zbigniew Jędrzejewski-Szmek dd42fc
  stream must again be flushed before trying to access these variables.
Zbigniew Jędrzejewski-Szmek dd42fc
Zbigniew Jędrzejewski-Szmek dd42fc
Without that call, dump remains NULL and the daemon crashes in
Zbigniew Jędrzejewski-Szmek dd42fc
log_dump().
Zbigniew Jędrzejewski-Szmek dd42fc
Zbigniew Jędrzejewski-Szmek dd42fc
(cherry picked from commit b2cdc6664ef6b56e47d38649d69b9943d9f9f5d0)
Zbigniew Jędrzejewski-Szmek dd42fc
---
Zbigniew Jędrzejewski-Szmek dd42fc
 src/core/manager.c | 5 +++++
Zbigniew Jędrzejewski-Szmek dd42fc
 1 file changed, 5 insertions(+)
Zbigniew Jędrzejewski-Szmek dd42fc
Zbigniew Jędrzejewski-Szmek dd42fc
diff --git a/src/core/manager.c b/src/core/manager.c
Zbigniew Jędrzejewski-Szmek dd42fc
index 7c7f088..ee92f1b 100644
Zbigniew Jędrzejewski-Szmek dd42fc
--- a/src/core/manager.c
Zbigniew Jędrzejewski-Szmek dd42fc
+++ b/src/core/manager.c
Zbigniew Jędrzejewski-Szmek dd42fc
@@ -1618,6 +1618,11 @@ static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t
Zbigniew Jędrzejewski-Szmek dd42fc
                                 break;
Zbigniew Jędrzejewski-Szmek dd42fc
                         }
Zbigniew Jędrzejewski-Szmek dd42fc
 
Zbigniew Jędrzejewski-Szmek dd42fc
+                        if (fflush(f)) {
Zbigniew Jędrzejewski-Szmek dd42fc
+                                log_warning("Failed to flush status stream");
Zbigniew Jędrzejewski-Szmek dd42fc
+                                break;
Zbigniew Jędrzejewski-Szmek dd42fc
+                        }
Zbigniew Jędrzejewski-Szmek dd42fc
+
Zbigniew Jędrzejewski-Szmek dd42fc
                         log_dump(LOG_INFO, dump);
Zbigniew Jędrzejewski-Szmek dd42fc
                         break;
Zbigniew Jędrzejewski-Szmek dd42fc
                 }