tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Level for Unix-domain socket options



The unix(4) man page incorrectly states:

"A UNIX-domain socket supports two socket-level options for use with
setsockopt(2) and getsockopt(2): [...]"

In reality, the protocol level when using these socket options
must be 0, which is a magic number not really documented anywhere
except the test suite.

I think we should:

(a) introduce SOL_LOCAL to sys/un.h as an alias for 0, as in FreeBSD
(b) document it
(c) update all in-tree users of Unix-domain socket options to use
SOL_LOCAL instead of hardcoding 0
Index: lib/libc/net/getpeereid.c
===================================================================
RCS file: /cvsroot/src/lib/libc/net/getpeereid.c,v
retrieving revision 1.3
diff -u -r1.3 getpeereid.c
--- lib/libc/net/getpeereid.c	16 Feb 2018 19:21:49 -0000	1.3
+++ lib/libc/net/getpeereid.c	5 Aug 2021 13:19:15 -0000
@@ -57,7 +57,7 @@
 	}
 
 	len = sizeof(cred);
-	if (getsockopt(s, 0, LOCAL_PEEREID, &cred, &len) == -1)
+	if (getsockopt(s, SOL_LOCAL, LOCAL_PEEREID, &cred, &len) == -1)
 		return -1;
 
 	if (euid != NULL)
Index: lib/libc/rpc/svc_vc.c
===================================================================
RCS file: /cvsroot/src/lib/libc/rpc/svc_vc.c,v
retrieving revision 1.34
diff -u -r1.34 svc_vc.c
--- lib/libc/rpc/svc_vc.c	10 Nov 2015 20:56:20 -0000	1.34
+++ lib/libc/rpc/svc_vc.c	5 Aug 2021 13:19:15 -0000
@@ -178,8 +178,8 @@
 	 * We want to be able to check credentials on local sockets.
 	 */
 	if (sslocal.ss_family == AF_LOCAL)
-		if (setsockopt(fd, 0, LOCAL_CREDS, &one, (socklen_t)sizeof one)
-		    == -1)
+		if (setsockopt(fd, SOL_LOCAL, LOCAL_CREDS, &one,
+		    (socklen_t)sizeof one) == -1)
 			goto cleanup_svc_vc_create;
 
 	xprt->xp_ltaddr.maxlen = xprt->xp_ltaddr.len = sslocal.ss_len;
Index: lib/libperfuse/perfuse.c
===================================================================
RCS file: /cvsroot/src/lib/libperfuse/perfuse.c,v
retrieving revision 1.42
diff -u -r1.42 perfuse.c
--- lib/libperfuse/perfuse.c	17 Apr 2019 12:30:51 -0000	1.42
+++ lib/libperfuse/perfuse.c	5 Aug 2021 13:19:15 -0000
@@ -255,7 +255,7 @@
 	 */
 	opt = 1;
 	optlen = sizeof(opt);
-	if (setsockopt(sv[1], 0, LOCAL_CREDS, &opt, optlen) != 0)
+	if (setsockopt(sv[1], SOL_LOCAL, LOCAL_CREDS, &opt, optlen) != 0)
 		DWARN("%s: setsockopt LOCAL_CREDS failed", __func__);
 
 	(void)sprintf(fdstr, "%d", sv[1]);
Index: regress/sys/kern/unfdpass/unfdpass.c
===================================================================
RCS file: /cvsroot/src/regress/sys/kern/unfdpass/unfdpass.c,v
retrieving revision 1.11
diff -u -r1.11 unfdpass.c
--- regress/sys/kern/unfdpass/unfdpass.c	10 Jan 2017 22:37:44 -0000	1.11
+++ regress/sys/kern/unfdpass/unfdpass.c	5 Aug 2021 13:19:15 -0000
@@ -168,7 +168,7 @@
 	sun.sun_len = SUN_LEN(&sun);
 
 	i = 1;
-	if (setsockopt(listensock, 0, LOCAL_CREDS, &i, sizeof(i)) == -1)
+	if (setsockopt(listensock, SOL_LOCAL, LOCAL_CREDS, &i, sizeof(i)) == -1)
 		err(1, "setsockopt");
 
 	if (bind(listensock, (struct sockaddr *)&sun, sizeof(sun)) == -1)
Index: share/man/man4/unix.4
===================================================================
RCS file: /cvsroot/src/share/man/man4/unix.4,v
retrieving revision 1.26
diff -u -r1.26 unix.4
--- share/man/man4/unix.4	3 Jul 2017 21:30:58 -0000	1.26
+++ share/man/man4/unix.4	5 Aug 2021 13:19:16 -0000
@@ -173,8 +173,8 @@
 when the destination socket is closed.
 .Pp
 A UNIX-domain socket supports two
-.Tn socket-level
-options for use with
+.Dv SOL_LOCAL
+level options for use with
 .Xr setsockopt 2
 and
 .Xr getsockopt 2 :
Index: sys/kern/uipc_usrreq.c
===================================================================
RCS file: /cvsroot/src/sys/kern/uipc_usrreq.c,v
retrieving revision 1.200
diff -u -r1.200 uipc_usrreq.c
--- sys/kern/uipc_usrreq.c	6 Nov 2020 14:50:13 -0000	1.200
+++ sys/kern/uipc_usrreq.c	5 Aug 2021 13:19:20 -0000
@@ -608,7 +608,7 @@
 
 	KASSERT(solocked(so));
 
-	if (sopt->sopt_level != 0) {
+	if (sopt->sopt_level != SOL_LOCAL) {
 		error = ENOPROTOOPT;
 	} else switch (op) {
 
Index: sys/sys/un.h
===================================================================
RCS file: /cvsroot/src/sys/sys/un.h,v
retrieving revision 1.59
diff -u -r1.59 un.h
--- sys/sys/un.h	6 Nov 2020 14:50:13 -0000	1.59
+++ sys/sys/un.h	5 Aug 2021 13:19:20 -0000
@@ -56,6 +56,7 @@
  * Socket options for UNIX IPC domain.
  */
 #if defined(_NETBSD_SOURCE)
+#define SOL_LOCAL	0		/* options level for get/setsockopt */
 #define	LOCAL_OCREDS	0x0001		/* pass credentials to receiver */
 #define	LOCAL_CONNWAIT	0x0002		/* connects block until accepted */
 #define	LOCAL_PEEREID	0x0003		/* get peer identification */
Index: tests/net/net/t_unix.c
===================================================================
RCS file: /cvsroot/src/tests/net/net/t_unix.c,v
retrieving revision 1.24
diff -u -r1.24 t_unix.c
--- tests/net/net/t_unix.c	28 Aug 2020 14:18:29 -0000	1.24
+++ tests/net/net/t_unix.c	5 Aug 2021 13:19:20 -0000
@@ -147,7 +147,7 @@
 # define LOCAL_PEEREID SO_PEERCRED
 # define LEVEL SOL_SOCKET
 #else
-# define LEVEL 0
+# define LEVEL SOL_LOCAL
 #endif
 
 #ifdef LOCAL_PEEREID
Index: usr.sbin/perfused/msg.c
===================================================================
RCS file: /cvsroot/src/usr.sbin/perfused/msg.c,v
retrieving revision 1.25
diff -u -r1.25 msg.c
--- usr.sbin/perfused/msg.c	17 Apr 2019 12:30:51 -0000	1.25
+++ usr.sbin/perfused/msg.c	5 Aug 2021 13:19:21 -0000
@@ -92,7 +92,7 @@
 	 * Request peer credentials
 	 */
 	opt = 1;
-	if (setsockopt(s, 0, LOCAL_CREDS, &opt, sizeof(opt)) != 0)
+	if (setsockopt(s, SOL_LOCAL, LOCAL_CREDS, &opt, sizeof(opt)) != 0)
 		DWARN("%s: setsockopt LOCAL_CREDS failed", __func__);
 	
 	if (bind(s, sa, (socklen_t )sun.sun_len) == -1)
Index: usr.sbin/perfused/perfused.c
===================================================================
RCS file: /cvsroot/src/usr.sbin/perfused/perfused.c,v
retrieving revision 1.25
diff -u -r1.25 perfused.c
--- usr.sbin/perfused/perfused.c	12 Dec 2014 09:58:39 -0000	1.25
+++ usr.sbin/perfused/perfused.c	5 Aug 2021 13:19:21 -0000
@@ -125,7 +125,7 @@
 	 * We do not need peer creds beyond this point
 	 */
 	opt = 0;
-	if (setsockopt(fd, 0, LOCAL_CREDS, &opt, sizeof(opt)) != 0)
+	if (setsockopt(fd, SOL_LOCAL, LOCAL_CREDS, &opt, sizeof(opt)) != 0)
 		DWARN("%s: setsockopt LOCAL_CREDS failed", __func__);
 
 #ifdef PERFUSE_DEBUG
Index: usr.sbin/sdpd/server.c
===================================================================
RCS file: /cvsroot/src/usr.sbin/sdpd/server.c,v
retrieving revision 1.11
diff -u -r1.11 server.c
--- usr.sbin/sdpd/server.c	1 Mar 2012 22:38:31 -0000	1.11
+++ usr.sbin/sdpd/server.c	5 Aug 2021 13:19:21 -0000
@@ -165,7 +165,7 @@
 	}
 
 	opt = 1;
-	if (setsockopt(fd, 0, LOCAL_CREDS, &opt, sizeof(opt)) == -1)
+	if (setsockopt(fd, SOL_LOCAL, LOCAL_CREDS, &opt, sizeof(opt)) == -1)
 		log_crit("Warning: No credential checks on control socket");
 
 	memset(&un, 0, sizeof(un));


Home | Main Index | Thread Index | Old Index