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