]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
stream/tcp: fix invalid ack events in timewait state
authorVictor Julien <victor@inliniac.net>
Mon, 28 Dec 2020 18:18:08 +0000 (19:18 +0100)
committerVictor Julien <victor@inliniac.net>
Fri, 15 Jan 2021 07:01:19 +0000 (08:01 +0100)
(cherry picked from commit 895938080f52db464faf8d971fd5b06bc139ad0a)

src/stream-tcp.c

index 8683af70fcae96171be57aef9c2ebbc5c7bbd168..62d79b7927bc59573d6239f7316394ee86bdf5f8 100644 (file)
@@ -2932,10 +2932,13 @@ static int StreamTcpPacketStateFinWait1(ThreadVars *tv, Packet *p,
             if (StreamTcpPacketIsRetransmission(&ssn->server, p)) {
                 SCLogDebug("ssn %p: packet is retransmission", ssn);
                 retransmission = 1;
+            } else if (SEQ_EQ(ssn->server.next_seq, TCP_GET_SEQ(p)) &&
+                       SEQ_EQ(ssn->client.last_ack, TCP_GET_ACK(p))) {
+                SCLogDebug("ssn %p: packet is retransmission", ssn);
+                retransmission = 1;
 
             } else if (SEQ_LT(TCP_GET_SEQ(p), ssn->server.next_seq) ||
-                    SEQ_GT(TCP_GET_SEQ(p), (ssn->server.last_ack + ssn->server.window)))
-            {
+                       SEQ_GT(TCP_GET_SEQ(p), (ssn->server.last_ack + ssn->server.window))) {
                 SCLogDebug("ssn %p: -> SEQ mismatch, packet SEQ %" PRIu32 ""
                         " != %" PRIu32 " from stream", ssn,
                         TCP_GET_SEQ(p), ssn->server.next_seq);
@@ -3342,6 +3345,10 @@ static int StreamTcpPacketStateFinWait2(ThreadVars *tv, Packet *p,
                 StreamTcpPacketSetState(p, ssn, TCP_TIME_WAIT);
                 SCLogDebug("ssn %p: state changed to TCP_TIME_WAIT", ssn);
 
+                if (SEQ_EQ(ssn->client.next_seq, TCP_GET_SEQ(p))) {
+                    StreamTcpUpdateNextSeq(
+                            ssn, &ssn->client, (ssn->client.next_seq + p->payload_len));
+                }
                 ssn->server.window = TCP_GET_WINDOW(p) << ssn->server.wscale;
             }