Log: Fix broken syslog name
BIRD passed string from configuration to openlog(), which kept it internally. After reconfiguration the old string was freed, therefore openlog had invalid copy. Thanks to Chris Caputo for the original patch.
This commit is contained in:
parent
3213273d82
commit
17fe57d8dc
2 changed files with 20 additions and 7 deletions
|
@ -30,6 +30,15 @@ static inline char *xbasename(const char *str)
|
||||||
return s ? s+1 : (char *) str;
|
return s ? s+1 : (char *) str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline char *
|
||||||
|
xstrdup(const char *c)
|
||||||
|
{
|
||||||
|
size_t l = strlen(c) + 1;
|
||||||
|
char *z = xmalloc(l);
|
||||||
|
memcpy(z, c, l);
|
||||||
|
return z;
|
||||||
|
}
|
||||||
|
|
||||||
#define ROUTER_ID_64_LENGTH 23
|
#define ROUTER_ID_64_LENGTH 23
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -288,18 +288,22 @@ log_switch(int debug, list *l, char *new_syslog_name)
|
||||||
current_log_list = l;
|
current_log_list = l;
|
||||||
|
|
||||||
#ifdef HAVE_SYSLOG
|
#ifdef HAVE_SYSLOG
|
||||||
char *old_syslog_name = current_syslog_name;
|
if (current_syslog_name && new_syslog_name &&
|
||||||
current_syslog_name = new_syslog_name;
|
!strcmp(current_syslog_name, new_syslog_name))
|
||||||
|
|
||||||
if (old_syslog_name && new_syslog_name &&
|
|
||||||
!strcmp(old_syslog_name, new_syslog_name))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (old_syslog_name)
|
if (current_syslog_name)
|
||||||
|
{
|
||||||
closelog();
|
closelog();
|
||||||
|
xfree(current_syslog_name);
|
||||||
|
current_syslog_name = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (new_syslog_name)
|
if (new_syslog_name)
|
||||||
openlog(new_syslog_name, LOG_CONS | LOG_NDELAY, LOG_DAEMON);
|
{
|
||||||
|
current_syslog_name = xstrdup(new_syslog_name);
|
||||||
|
openlog(current_syslog_name, LOG_CONS | LOG_NDELAY, LOG_DAEMON);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue