tcp: fix sack block validation on wrap 37/27237/2
authorFlorin Coras <fcoras@cisco.com>
Mon, 25 May 2020 19:15:56 +0000 (19:15 +0000)
committerFlorin Coras <fcoras@cisco.com>
Mon, 25 May 2020 19:36:59 +0000 (19:36 +0000)
Type: fix
Fixes: 487507f

Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: Ia9813ae09d14111dc8edac0fa6ab082e13ab6e2e

src/plugins/unittest/tcp_test.c
src/vnet/tcp/tcp_sack.c

index 535f055..b98d360 100644 (file)
@@ -637,6 +637,32 @@ tcp_test_sack_rx (vlib_main_t * vm, unformat_input_t * input)
   TCP_TEST ((sb->rxt_sacked == 300), "last rxt sacked bytes %d",
            sb->rxt_sacked);
 
+  /*
+   * Restart
+   */
+  scoreboard_clear (sb);
+  vec_reset_length (tc->rcv_opts.sacks);
+
+  /*
+   * Broken sacks:
+   * block.start > snd_nxt
+   * && block.start < blk.end
+   * && block.end <= snd_nxt
+   */
+  tc->flags = 0;
+  block.start = 2147483647;
+  block.end = 4294967295;
+  vec_add1 (tc->rcv_opts.sacks, block);
+  tc->snd_una = tc->snd_nxt = 1969067947;
+
+  tcp_rcv_sacks (tc, tc->snd_una);
+
+  /*
+   * Clear
+   */
+  scoreboard_clear (sb);
+  vec_reset_length (tc->rcv_opts.sacks);
+
   return 0;
 }
 
index 589c7f3..b9e1166 100644 (file)
@@ -326,7 +326,9 @@ tcp_rcv_sacks (tcp_connection_t * tc, u32 ack)
     {
       if (seq_lt (blk->start, blk->end)
          && seq_gt (blk->start, tc->snd_una)
-         && seq_gt (blk->start, ack) && seq_leq (blk->end, tc->snd_nxt))
+         && seq_gt (blk->start, ack)
+         && seq_lt (blk->start, tc->snd_nxt)
+         && seq_leq (blk->end, tc->snd_nxt))
        {
          blk++;
          continue;