session udp: add len check for tx dgrams 35/39135/4
authorFlorin Coras <fcoras@cisco.com>
Wed, 28 Jun 2023 02:45:59 +0000 (19:45 -0700)
committerFlorin Coras <fcoras@cisco.com>
Wed, 28 Jun 2023 03:34:21 +0000 (20:34 -0700)
Type: fix

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

src/vnet/session/session.h
src/vnet/session/session_node.c
src/vnet/udp/udp.c

index e92b1f0..10bae27 100644 (file)
@@ -582,6 +582,19 @@ transport_rx_fifo_has_ooo_data (transport_connection_t * tc)
   return svm_fifo_has_ooo_data (s->rx_fifo);
 }
 
+always_inline u32
+transport_tx_fifo_has_dgram (transport_connection_t *tc)
+{
+  session_t *s = session_get (tc->s_index, tc->thread_index);
+  u32 max_deq = svm_fifo_max_dequeue_cons (s->tx_fifo);
+  session_dgram_pre_hdr_t phdr;
+
+  if (max_deq <= sizeof (session_dgram_hdr_t))
+    return 0;
+  svm_fifo_peek (s->tx_fifo, 0, sizeof (phdr), (u8 *) &phdr);
+  return max_deq >= phdr.data_length + sizeof (session_dgram_hdr_t);
+}
+
 always_inline void
 transport_rx_fifo_req_deq_ntf (transport_connection_t *tc)
 {
index f652f2e..6d1b6bd 100644 (file)
@@ -1236,6 +1236,13 @@ session_tx_set_dequeue_params (vlib_main_t * vm, session_tx_context_t * ctx,
              ctx->max_len_to_snd = 0;
              return;
            }
+         /* We cannot be sure apps have not enqueued incomplete dgrams */
+         if (PREDICT_FALSE (ctx->max_dequeue <
+                            ctx->hdr.data_length + sizeof (ctx->hdr)))
+           {
+             ctx->max_len_to_snd = 0;
+             return;
+           }
          ASSERT (ctx->hdr.data_length > ctx->hdr.data_offset);
          len = ctx->hdr.data_length - ctx->hdr.data_offset;
 
index b3c410a..a8e0130 100644 (file)
@@ -317,7 +317,7 @@ udp_push_header (transport_connection_t *tc, vlib_buffer_t **bs, u32 n_bufs)
 
   if (PREDICT_FALSE (uc->flags & UDP_CONN_F_CLOSING))
     {
-      if (!transport_max_tx_dequeue (&uc->connection))
+      if (!transport_tx_fifo_has_dgram (&uc->connection))
        udp_connection_program_cleanup (uc);
     }
 
@@ -343,7 +343,7 @@ udp_session_close (u32 connection_index, u32 thread_index)
   if (!uc || (uc->flags & UDP_CONN_F_MIGRATED))
     return;
 
-  if (!transport_max_tx_dequeue (&uc->connection))
+  if (!transport_tx_fifo_has_dgram (&uc->connection))
     udp_connection_program_cleanup (uc);
   else
     uc->flags |= UDP_CONN_F_CLOSING;