Assert that the socket lock is held when `so_qlen' is modified.
authormpi <mpi@openbsd.org>
Tue, 4 Jul 2017 12:51:18 +0000 (12:51 +0000)
committermpi <mpi@openbsd.org>
Tue, 4 Jul 2017 12:51:18 +0000 (12:51 +0000)
ok bluhm@, visa@

sys/kern/uipc_socket2.c
sys/sys/socketvar.h

index 9619cbd..d8fc578 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: uipc_socket2.c,v 1.80 2017/06/27 12:02:43 mpi Exp $   */
+/*     $OpenBSD: uipc_socket2.c,v 1.81 2017/07/04 12:51:18 mpi Exp $   */
 /*     $NetBSD: uipc_socket2.c,v 1.11 1996/02/04 02:17:55 christos Exp $       */
 
 /*
@@ -208,6 +208,7 @@ sonewconn(struct socket *head, int connstatus)
 void
 soqinsque(struct socket *head, struct socket *so, int q)
 {
+       soassertlocked(head);
 
 #ifdef DIAGNOSTIC
        if (so->so_onq != NULL)
@@ -228,9 +229,10 @@ soqinsque(struct socket *head, struct socket *so, int q)
 int
 soqremque(struct socket *so, int q)
 {
-       struct socket *head;
+       struct socket *head = so->so_head;
+
+       soassertlocked(head);
 
-       head = so->so_head;
        if (q == 0) {
                if (so->so_onq != &head->so_q0)
                        return (0);
index 857e236..514156e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: socketvar.h,v 1.70 2017/06/26 09:32:32 mpi Exp $      */
+/*     $OpenBSD: socketvar.h,v 1.71 2017/07/04 12:51:18 mpi Exp $      */
 /*     $NetBSD: socketvar.h,v 1.18 1996/02/09 18:25:38 christos Exp $  */
 
 /*-
@@ -199,11 +199,15 @@ sbspace(struct socket *so, struct sockbuf *sb)
     ((so)->so_state & SS_ISSENDING)
 
 /* can we read something from so? */
-#define        soreadable(so)  \
-    (!isspliced(so) && \
-    ((so)->so_rcv.sb_cc >= (so)->so_rcv.sb_lowat || \
-    ((so)->so_state & SS_CANTRCVMORE) || \
-    (so)->so_qlen || (so)->so_error))
+static inline int
+soreadable(struct socket *so)
+{
+       soassertlocked(so);
+       if (isspliced(so))
+               return 0;
+       return (so->so_state & SS_CANTRCVMORE) || so->so_qlen || so->so_error ||
+           so->so_rcv.sb_cc >= so->so_rcv.sb_lowat;
+}
 
 /* can we write something to so? */
 #define        sowriteable(so) \