Index | Thread | Search

From:
Vitaliy Makkoveev <mvs@openbsd.org>
Subject:
Take solock_shared() in soo_stat()
To:
tech@openbsd.org
Date:
Wed, 10 Apr 2024 16:09:00 +0300

Download raw body.

Thread
Only unix(4) and tcp(4) sockets set (*pru_sence)() handler. The rest of
soo_stat() is the read only access.

solock() can't be pushed down to PCB layer because tcp(4) `so_rcv' still
relies on it.

Index: sys/kern/sys_socket.c
===================================================================
RCS file: /cvs/src/sys/kern/sys_socket.c,v
retrieving revision 1.63
diff -u -p -r1.63 sys_socket.c
--- sys/kern/sys_socket.c	31 Mar 2024 13:50:00 -0000	1.63
+++ sys/kern/sys_socket.c	10 Apr 2024 13:06:26 -0000
@@ -145,7 +145,7 @@ soo_stat(struct file *fp, struct stat *u
 
 	memset(ub, 0, sizeof (*ub));
 	ub->st_mode = S_IFSOCK;
-	solock(so);
+	solock_shared(so);
 	mtx_enter(&so->so_rcv.sb_mtx);
 	if ((so->so_rcv.sb_state & SS_CANTRCVMORE) == 0 ||
 	    so->so_rcv.sb_cc != 0)
@@ -156,7 +156,7 @@ soo_stat(struct file *fp, struct stat *u
 	ub->st_uid = so->so_euid;
 	ub->st_gid = so->so_egid;
 	(void)pru_sense(so, ub);
-	sounlock(so);
+	sounlock_shared(so);
 	return (0);
 }