Index | Thread | Search

From:
Alexander Bluhm <bluhm@openbsd.org>
Subject:
fstat socket buffer mutex
To:
tech@openbsd.org
Date:
Sat, 9 Nov 2024 15:38:19 +0100

Download raw body.

Thread
Hi,

I wonder if we should also lock so_snd in soo_stat().  Take so_rcv
and so_snd mutex together to provide consistent view to userland.

ok?

bluhm

Index: kern/sys_socket.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/kern/sys_socket.c,v
diff -u -p -r1.65 sys_socket.c
--- kern/sys_socket.c	30 Apr 2024 17:59:15 -0000	1.65
+++ kern/sys_socket.c	9 Nov 2024 14:33:20 -0000
@@ -149,12 +149,14 @@ soo_stat(struct file *fp, struct stat *u
 	ub->st_mode = S_IFSOCK;
 	solock_shared(so);
 	mtx_enter(&so->so_rcv.sb_mtx);
+	mtx_enter(&so->so_snd.sb_mtx);
 	if ((so->so_rcv.sb_state & SS_CANTRCVMORE) == 0 ||
 	    so->so_rcv.sb_cc != 0)
 		ub->st_mode |= S_IRUSR | S_IRGRP | S_IROTH;
-	mtx_leave(&so->so_rcv.sb_mtx);
 	if ((so->so_snd.sb_state & SS_CANTSENDMORE) == 0)
 		ub->st_mode |= S_IWUSR | S_IWGRP | S_IWOTH;
+	mtx_leave(&so->so_snd.sb_mtx);
+	mtx_leave(&so->so_rcv.sb_mtx);
 	ub->st_uid = so->so_euid;
 	ub->st_gid = so->so_egid;
 	(void)pru_sense(so, ub);