sctp: Fix SHUTDOWN CTSN Ack in the peer restart case
authorJere Leppänen <jere.leppanen@nokia.com>
Tue, 21 Apr 2020 19:03:42 +0000 (22:03 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 10 May 2020 08:28:03 +0000 (10:28 +0200)
commit 12dfd78e3a74825e6f0bc8df7ef9f938fbc6bfe3 upstream.

When starting shutdown in sctp_sf_do_dupcook_a(), get the value for
SHUTDOWN Cumulative TSN Ack from the new association, which is
reconstructed from the cookie, instead of the old association, which
the peer doesn't have anymore.

Otherwise the SHUTDOWN is either ignored or replied to with an ABORT
by the peer because CTSN Ack doesn't match the peer's Initial TSN.

Fixes: bdf6fa52f01b ("sctp: handle association restarts when the socket is closed.")
Signed-off-by: Jere Leppänen <jere.leppanen@nokia.com>
Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
net/sctp/sm_make_chunk.c

index fc67d356b5fa009a81a8ce123b0c20c9baac032f..acb0c2631c7928aa43e8c64a60d7e5e834ddb360 100644 (file)
@@ -856,7 +856,11 @@ struct sctp_chunk *sctp_make_shutdown(const struct sctp_association *asoc,
        sctp_shutdownhdr_t shut;
        __u32 ctsn;
 
-       ctsn = sctp_tsnmap_get_ctsn(&asoc->peer.tsn_map);
+       if (chunk && chunk->asoc)
+               ctsn = sctp_tsnmap_get_ctsn(&chunk->asoc->peer.tsn_map);
+       else
+               ctsn = sctp_tsnmap_get_ctsn(&asoc->peer.tsn_map);
+
        shut.cum_tsn_ack = htonl(ctsn);
 
        retval = sctp_make_control(asoc, SCTP_CID_SHUTDOWN, 0,