From: David Disseldorp Date: Wed, 6 Feb 2019 11:39:03 +0000 (+0100) Subject: lib/debug: retain full string in state.prog_name global X-Git-Url: http://git.samba.org/?a=commitdiff_plain;h=c824240cd48aea9e0655287c98c8de7c3ffd5f94;p=metze%2Fsamba%2Fwip.git lib/debug: retain full string in state.prog_name global 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 Reviewed-by: Andreas Schneider --- diff --git a/lib/util/debug.c b/lib/util/debug.c index 30e5a28a2338..e6a1ba4f96f8 100644 --- a/lib/util/debug.c +++ b/lib/util/debug.c @@ -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(); }