Commit 17fe57d8 authored by Ondrej Zajicek (work)'s avatar Ondrej Zajicek (work)
Browse files

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.
parent 3213273d
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -30,6 +30,15 @@ static inline char *xbasename(const 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

#endif
+11 −7
Original line number Diff line number Diff line
@@ -288,18 +288,22 @@ log_switch(int debug, list *l, char *new_syslog_name)
  current_log_list = l;

#ifdef HAVE_SYSLOG
  char *old_syslog_name = current_syslog_name;
  current_syslog_name = new_syslog_name;

  if (old_syslog_name && new_syslog_name &&
      !strcmp(old_syslog_name, new_syslog_name))
  if (current_syslog_name && new_syslog_name &&
      !strcmp(current_syslog_name, new_syslog_name))
    return;

  if (old_syslog_name)
  if (current_syslog_name)
  {
    closelog();
    xfree(current_syslog_name);
    current_syslog_name = NULL;
  }

  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
}