--- //depot/vendor/freebsd/src/sys/netinet6/icmp6.c 2005/10/21 16:25:31 +++ //depot/user/rwatson/sockref/src/sys/netinet6/icmp6.c 2006/04/15 01:41:20 @@ -1954,7 +1954,9 @@ ip6_savecontrol(last, n, &opts); /* strip intermediate headers */ m_adj(n, off); - if (sbappendaddr(&last->in6p_socket->so_rcv, + SOCKBUF_LOCK(&last->in6p_socket->so_rcv); + if (sbappendaddr_locked( + &last->in6p_socket->so_rcv, (struct sockaddr *)&fromsa, n, opts) == 0) { /* should notify about lost packet */ @@ -1962,8 +1964,10 @@ if (opts) { m_freem(opts); } + SOCKBUF_UNLOCK( + &last->in6p_socket->so_rcv); } else - sorwakeup(last->in6p_socket); + sorwakeup_locked(last->in6p_socket); opts = NULL; } INP_UNLOCK(last); @@ -1995,13 +1999,15 @@ } } } - if (sbappendaddr(&last->in6p_socket->so_rcv, + SOCKBUF_LOCK(&last->in6p_socket->so_rcv); + if (sbappendaddr_locked(&last->in6p_socket->so_rcv, (struct sockaddr *)&fromsa, m, opts) == 0) { m_freem(m); if (opts) m_freem(opts); + SOCKBUF_UNLOCK(&last->in6p_socket->so_rcv); } else - sorwakeup(last->in6p_socket); + sorwakeup_locked(last->in6p_socket); INP_UNLOCK(last); } else { m_freem(m);