From: Matthew Dillon Date: Tue, 14 Sep 2010 01:40:22 +0000 (-0700) Subject: network - Protect soreceive() from backend X-Git-Tag: v2.9.0~208 X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/commitdiff_plain/20156c7a505bd443382703603318fd756815445d network - Protect soreceive() from backend * Somehow I missed the token required in soreceive() to protect it from the backend. --- diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index aa6b113525..4ec07d3cad 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -869,6 +869,11 @@ bad: if ((so->so_state & SS_ISCONFIRMING) && resid) so_pru_rcvd(so, 0); + /* + * The token interlocks against the protocol thread while + * ssb_lock is a blocking lock against other userland entities. + */ + lwkt_gettoken(&so->so_rcv.ssb_token); restart: error = ssb_lock(&so->so_rcv, SBLOCKWAIT(flags)); if (error) @@ -1152,6 +1157,7 @@ dontblock: release: ssb_unlock(&so->so_rcv); done: + lwkt_reltoken(&so->so_rcv.ssb_token); if (free_chain) m_freem(free_chain); return (error);