diff --git a/usr.sbin/syslogd/syslogd.h b/usr.sbin/syslogd/syslogd.h --- a/usr.sbin/syslogd/syslogd.h +++ b/usr.sbin/syslogd/syslogd.h @@ -133,7 +133,8 @@ */ struct socklist { int sl_socket; - const char *sl_name; + char *sl_name; + int sl_dirfd; struct addrinfo sl_ai; #define sl_sa sl_ai.ai_addr #define sl_salen sl_ai.ai_addrlen diff --git a/usr.sbin/syslogd/syslogd.c b/usr.sbin/syslogd/syslogd.c --- a/usr.sbin/syslogd/syslogd.c +++ b/usr.sbin/syslogd/syslogd.c @@ -118,6 +118,7 @@ #include #include #include +#include #include #include #include @@ -277,6 +278,7 @@ struct socklist *sl; int (*sl_recv)(struct socklist *); int s, optval = 1; + char *name2; if (ai->ai_family != AF_LOCAL && SecureMode > 1) { /* Only AF_LOCAL in secure mode. */ @@ -359,7 +361,16 @@ if (sl == NULL) err(1, "malloc failed"); sl->sl_socket = s; - sl->sl_name = name; + if (ai->ai_family == AF_LOCAL) { + name2 = strdup(name); + if (name2 == NULL) + err(1, "strdup failed"); + sl->sl_name = strdup(basename(name2)); + sl->sl_dirfd = open(dirname(name2), O_DIRECTORY); + if (sl->sl_name == NULL || sl->sl_dirfd == -1) + err(1, "failed to save dir info for %s", name); + free(name2); + } sl->sl_recv = sl_recv; (void)memcpy(&sl->sl_ai, ai, sizeof(*ai)); if (ai->ai_addrlen > 0) { @@ -2209,8 +2220,12 @@ logerror(buf); } STAILQ_FOREACH(sl, &shead, next) { - if (sl->sl_sa != NULL && sl->sl_family == AF_LOCAL) - unlink(sl->sl_name); + if (sl->sl_sa != NULL && sl->sl_family == AF_LOCAL) { + if (unlinkat(sl->sl_dirfd, sl->sl_name, 0) == -1) + dprintf("Failed to unlink %s", sl->sl_name); + free(sl->sl_name); + close(sl->sl_dirfd); + } } pidfile_remove(pfh);