forked from pool/systemd
46 lines
1.7 KiB
Diff
46 lines
1.7 KiB
Diff
|
From b2cdc6664ef6b56e47d38649d69b9943d9f9f5d0 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().
|
||
|
---
|
||
|
src/core/manager.c | 5 +++++
|
||
|
1 file changed, 5 insertions(+)
|
||
|
|
||
|
diff --git src/core/manager.c src/core/manager.c
|
||
|
index 27a1cc6..78f4f3d 100644
|
||
|
--- src/core/manager.c
|
||
|
+++ src/core/manager.c
|
||
|
@@ -1621,6 +1621,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;
|
||
|
}
|
||
|
--
|
||
|
1.7.9.2
|
||
|
|