[systemd-commits] src/core

Daniel Mack zonque at kemper.freedesktop.org
Fri Mar 7 06:18:53 PST 2014


 src/core/manager.c |    5 +++++
 1 file changed, 5 insertions(+)

New commits:
commit b2cdc6664ef6b56e47d38649d69b9943d9f9f5d0
Author: Daniel Mack <zonque at gmail.com>
Date:   Fri Mar 7 14:43:59 2014 +0100

    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().

diff --git a/src/core/manager.c b/src/core/manager.c
index 27a1cc6..78f4f3d 100644
--- a/src/core/manager.c
+++ b/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;
                 }



More information about the systemd-commits mailing list