lib/debug: retain full string in state.prog_name global
authorDavid Disseldorp <ddiss@samba.org>
Wed, 6 Feb 2019 11:39:03 +0000 (12:39 +0100)
committerDavid Disseldorp <ddiss@samba.org>
Thu, 7 Feb 2019 16:23:18 +0000 (17:23 +0100)
setup_logging() retains a global pointer to the provided const string in
state.prog_name, which is later used in the debug_backend->reload()
callback.
Some setup_logging() callers, such as popt_common_callback(),
incorrectly assume that a dynamic buffer is safe to provide as a
prog_name parameter. Fix this by copying the entire string in
setup_logging().

Signed-off-by: David Disseldorp <ddiss@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
lib/util/debug.c

index 30e5a28a23384350e9b5e93a664e465ff48eb120..e6a1ba4f96f8ff8efeb743c9699a4cdb778b86c4 100644 (file)
@@ -87,7 +87,7 @@
 static struct {
        bool initialized;
        enum debug_logtype logtype; /* The type of logging we are doing: eg stdout, file, stderr */
-       const char *prog_name;
+       char prog_name[255];
        bool reopening_logs;
        bool schedule_reopen_logs;
 
@@ -227,11 +227,15 @@ static void debug_syslog_reload(bool enabled, bool previously_enabled,
                                const char *prog_name, char *option)
 {
        if (enabled && !previously_enabled) {
+               const char *ident = NULL;
+               if ((prog_name != NULL) && (prog_name[0] != '\0')) {
+                       ident = prog_name;
+               }
 #ifdef LOG_DAEMON
-               openlog(prog_name, LOG_PID, SYSLOG_FACILITY);
+               openlog(ident, LOG_PID, SYSLOG_FACILITY);
 #else
                /* for old systems that have no facility codes. */
-               openlog(prog_name, LOG_PID );
+               openlog(ident, LOG_PID);
 #endif
                return;
        }
@@ -1001,7 +1005,7 @@ void setup_logging(const char *prog_name, enum debug_logtype new_logtype)
                        prog_name = p + 1;
                }
 
-               state.prog_name = prog_name;
+               strlcpy(state.prog_name, prog_name, sizeof(state.prog_name));
        }
        reopen_logs_internal();
 }