From ec5c91e72cc134e781a8cc4d1811f8f30dadda59 Mon Sep 17 00:00:00 2001 From: Avi Kivity <avi@cloudius-systems.com> Date: Mon, 20 Jan 2014 15:38:55 +0200 Subject: [PATCH] net: fix sblock() sblock() takes sb_rwlock for reading, and is the only such locker, so it clearly has no effect. Change it to acquire the lock for writing, so it serializes access to the socket buffer as intended. Bug introduced in 6296cbabf89f10b. Reviewed-by: Glauber Costa <glommer@cloudius-systems.com> Reviewed-by: Nadav Har'El <nyh@cloudius-systems.com> Signed-off-by: Avi Kivity <avi@cloudius-systems.com> Signed-off-by: Pekka Enberg <penberg@cloudius-systems.com> --- bsd/sys/kern/uipc_sockbuf.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bsd/sys/kern/uipc_sockbuf.cc b/bsd/sys/kern/uipc_sockbuf.cc index 8b76262d3..c2a365273 100644 --- a/bsd/sys/kern/uipc_sockbuf.cc +++ b/bsd/sys/kern/uipc_sockbuf.cc @@ -147,10 +147,10 @@ sblock(struct sockbuf *sb, int flags) ("sblock: flags invalid (0x%x)", flags)); if (flags & SBL_WAIT) { - rw_rlock(&sb->sb_rwlock); + rw_wlock(&sb->sb_rwlock); return (0); } else { - if (rw_try_rlock(&sb->sb_rwlock) == 0) + if (rw_try_wlock(&sb->sb_rwlock) == 0) return (EWOULDBLOCK); return (0); } @@ -160,7 +160,7 @@ void sbunlock(struct sockbuf *sb) { - rw_runlock(&sb->sb_rwlock); + rw_wunlock(&sb->sb_rwlock); } void so_wake_poll(struct socket *so, struct sockbuf *sb) -- GitLab