tcp: fix tcp_connection_cleanup() with uninitialized elog 74/28074/3
authorIvan Shvedunov <ivan4th@gmail.com>
Mon, 27 Jul 2020 16:59:38 +0000 (19:59 +0300)
committerIvan Shvedunov <ivan4th@gmail.com>
Mon, 27 Jul 2020 17:16:46 +0000 (20:16 +0300)
This fixes TCP connection cleanup crash when TCP debugging is enabled.
It could happen if session_stream_accept() returned an error.

Type: fix

Signed-off-by: Ivan Shvedunov <ivan4th@gmail.com>
Change-Id: I0df08969d82bb0f44def81b9e47195bd15502831

src/vnet/tcp/tcp_input.c

index b8c889e..8efe0c5 100644 (file)
@@ -2630,6 +2630,13 @@ tcp46_listen_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
       tcp_connection_init_vars (child);
       child->rto = TCP_RTO_MIN;
 
+      /*
+       * This initializes elog track, must be done before synack.
+       * We also do it before possible tcp_connection_cleanup() as it
+       * generates TCP_EVT_DELETE event.
+       */
+      TCP_EVT (TCP_EVT_SYN_RCVD, child, 1);
+
       if (session_stream_accept (&child->connection, lc->c_s_index,
                                 lc->c_thread_index, 0 /* notify */ ))
        {
@@ -2640,9 +2647,6 @@ tcp46_listen_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
 
       child->tx_fifo_size = transport_tx_fifo_size (&child->connection);
 
-      /* This initializes elog track, must be done before synack */
-      TCP_EVT (TCP_EVT_SYN_RCVD, child, 1);
-
       tcp_send_synack (child);
 
     done: