Page MenuHomeFreeBSD

D41379.id125734.diff
No OneTemporary

D41379.id125734.diff

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 <errno.h>
#include <fcntl.h>
#include <fnmatch.h>
+#include <libgen.h>
#include <libutil.h>
#include <limits.h>
#include <netdb.h>
@@ -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);

File Metadata

Mime Type
text/plain
Expires
Tue, Apr 21, 2:42 AM (17 h, 56 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31881785
Default Alt Text
D41379.id125734.diff (1 KB)

Event Timeline