aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJake Freeland <jfree@FreeBSD.org>2023-09-01 02:51:06 +0000
committerMark Johnston <markj@FreeBSD.org>2023-09-28 15:51:53 +0000
commit5b44c24f8524558b4e4c4c24dc465e9f4eed5ae9 (patch)
tree047c251da358dbcc15c9a3996df99f191cc6b229
parent3854dd52a3d3ff4a7a298fba10c96c8988fb814d (diff)
downloadsrc-5b44c24f8524558b4e4c4c24dc465e9f4eed5ae9.tar.gz
src-5b44c24f8524558b4e4c4c24dc465e9f4eed5ae9.zip
syslogd: unlink() -> unlinkat()
Save basename and dirname for use in unlinkat() when removing UNIX sockets from fs. Reviewed by: markj, emaste MFC after: 3 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D41379
-rw-r--r--usr.sbin/syslogd/syslogd.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/usr.sbin/syslogd/syslogd.c b/usr.sbin/syslogd/syslogd.c
index d317afa73844..5ccea8ce424b 100644
--- a/usr.sbin/syslogd/syslogd.c
+++ b/usr.sbin/syslogd/syslogd.c
@@ -130,6 +130,7 @@ static char sccsid[] = "@(#)syslogd.c 8.3 (Berkeley) 4/4/94";
#include <errno.h>
#include <fcntl.h>
#include <fnmatch.h>
+#include <libgen.h>
#include <libutil.h>
#include <limits.h>
#include <netdb.h>
@@ -198,7 +199,8 @@ struct socklist {
#define sl_salen sl_ai.ai_addrlen
#define sl_family sl_ai.ai_family
int sl_socket;
- const char *sl_name;
+ char *sl_name;
+ int sl_dirfd;
int (*sl_recv)(struct socklist *);
STAILQ_ENTRY(socklist) next;
};
@@ -2341,8 +2343,12 @@ die(int signo)
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: %s", sl->sl_name,
+ strerror(errno));
+ }
+ }
}
pidfile_remove(pfh);
@@ -3782,7 +3788,16 @@ socksetup(struct addrinfo *ai, const char *name, mode_t mode)
if (sl == NULL)
err(1, "malloc failed");
sl->sl_socket = s;
- sl->sl_name = name;
+ if (ai->ai_family == AF_LOCAL) {
+ char *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) {