|
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 |
}
|