Hi,

With closefrom(4) we can avoid some global file descriptor variables
in syslogd(8).

ok?

bluhm

Index: usr.sbin/syslogd/privsep.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/syslogd/privsep.c,v
retrieving revision 1.62
diff -u -p -r1.62 privsep.c
--- usr.sbin/syslogd/privsep.c  6 Oct 2016 13:03:47 -0000       1.62
+++ usr.sbin/syslogd/privsep.c  6 Oct 2016 13:37:14 -0000
@@ -139,31 +139,11 @@ priv_init(int lockfd, int nullfd, int ar
        if (nullfd > 2)
                close(nullfd);
 
-       /* Close descriptors that only the unpriv child needs */
-       if (fd_ctlconn != -1)
-               close(fd_ctlconn);
-       if (fd_ctlsock != -1)
-               close(fd_ctlsock);
-       if (fd_klog != -1)
-               close(fd_klog);
-       if (fd_sendsys != -1)
-               close(fd_sendsys);
-       if (fd_udp != -1)
-               close(fd_udp);
-       if (fd_udp6 != -1)
-               close(fd_udp6);
-       if (fd_bind != -1)
-               close(fd_bind);
-       if (fd_listen != -1)
-               close(fd_listen);
-       if (fd_tls != -1)
-               close(fd_tls);
-       for (i = 0; i < nunix; i++)
-               if (fd_unix[i] != -1)
-                       close(fd_unix[i]);
 
        if (dup3(socks[0], 3, 0) == -1)
                err(1, "dup3 priv sock failed");
+       if (closefrom(4) == -1)
+               err(1, "closefrom 4 failed");
        snprintf(childnum, sizeof(childnum), "%d", child_pid);
        if ((privargv = reallocarray(NULL, argc + 3, sizeof(char *))) == NULL)
                err(1, "alloc priv argv failed");
Index: usr.sbin/syslogd/syslogd.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/syslogd/syslogd.c,v
retrieving revision 1.218
diff -u -p -r1.218 syslogd.c
--- usr.sbin/syslogd/syslogd.c  6 Oct 2016 13:03:47 -0000       1.218
+++ usr.sbin/syslogd/syslogd.c  6 Oct 2016 13:46:38 -0000
@@ -279,9 +279,8 @@ size_t      ctl_reply_offset = 0;   /* Number o
 char   *linebuf;
 int     linesize;
 
-int             fd_ctlsock, fd_ctlconn, fd_klog, fd_sendsys, fd_udp, fd_udp6,
-                fd_bind, fd_listen, fd_tls, fd_unix[MAXUNIX];
-struct event    *ev_ctlaccept, *ev_ctlread, *ev_ctlwrite;
+int             fd_ctlconn, fd_udp, fd_udp6, fd_tls;
+struct event   *ev_ctlaccept, *ev_ctlread, *ev_ctlwrite;
 
 struct peer {
        struct buffertls         p_buftls;
@@ -359,6 +358,8 @@ main(int argc, char *argv[])
        char            *p;
        int              ch, i;
        int              lockpipe[2] = { -1, -1}, pair[2], nullfd, fd;
+       int              fd_ctlsock, fd_klog, fd_sendsys, fd_bind, fd_listen;
+       int              fd_unix[MAXUNIX];
 
        while ((ch = getopt(argc, argv, "46a:C:c:dFf:hK:k:m:nP:p:S:s:T:U:uVZ"))
            != -1)
Index: usr.sbin/syslogd/syslogd.h
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/syslogd/syslogd.h,v
retrieving revision 1.24
diff -u -p -r1.24 syslogd.h
--- usr.sbin/syslogd/syslogd.h  6 Oct 2016 13:03:47 -0000       1.24
+++ usr.sbin/syslogd/syslogd.h  6 Oct 2016 13:38:54 -0000
@@ -46,8 +46,6 @@ int  receive_fd(int);
 extern int nunix;
 extern char *path_unix[MAXUNIX];
 extern char *path_ctlsock;
-extern int fd_ctlsock, fd_ctlconn, fd_klog, fd_sendsys;
-extern int fd_udp, fd_udp6, fd_bind, fd_listen, fd_tls, fd_unix[MAXUNIX];
 
 #define MAXLINE                8192            /* maximum line length */
 #define ERRBUFSIZE     256

Reply via email to