Check `so_state' in rtm_senddesync() and return if SS_ISCONNECTED or
authormvs <mvs@openbsd.org>
Tue, 1 Jun 2021 14:23:34 +0000 (14:23 +0000)
committermvs <mvs@openbsd.org>
Tue, 1 Jun 2021 14:23:34 +0000 (14:23 +0000)
SS_CANTRCVMORE bits are set.

The first check required to prevent timeout_add(9) reschedule
`rop_timeout', otherwise timeout_del_barrier(9) can't help us.

The second check is for the case when shutdown(2) with SHUT_RD argument
occurred on this socket and we should not receive anything include
RTM_DESYNC packets.

ok claudio@

sys/net/rtsock.c

index 2b6d4e9..29c8645 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: rtsock.c,v 1.317 2021/05/30 21:01:27 bluhm Exp $      */
+/*     $OpenBSD: rtsock.c,v 1.318 2021/06/01 14:23:34 mvs Exp $        */
 /*     $NetBSD: rtsock.c,v 1.18 1996/03/29 00:32:10 cgd Exp $  */
 
 /*
@@ -464,6 +464,15 @@ rtm_senddesync(struct socket *so)
 
        soassertlocked(so);
 
+       /*
+        * Dying socket is disconnected by upper layer and there is
+        * no reason to send packet. Also we shouldn't reschedule
+        * timeout(9), otherwise timeout_del_barrier(9) can't help us.
+        */
+       if ((so->so_state & SS_ISCONNECTED) == 0 ||
+           (so->so_state & SS_CANTRCVMORE))
+               return;
+
        /* If we are in a DESYNC state, try to send a RTM_DESYNC packet */
        if ((rop->rop_flags & ROUTECB_FLAG_DESYNC) == 0)
                return;