From b3392334942ed5459edfa7f11e098f4eab3aa29a Mon Sep 17 00:00:00 2001 From: Aloys Augustin Date: Tue, 6 Aug 2019 16:09:01 +0200 Subject: udp: fix connections move Without this the use of uc0 is racy between the current thread and the thread that owns it and will delete it. This also ensures we don't trigger a read event on the session before moving it to the right thread and notifying the application. Type: fix Change-Id: Icb1ca3ee5805ea3c0d2d424d4b23511465deb3b6 Signed-off-by: Aloys Augustin --- src/vnet/udp/udp_input.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src/vnet/udp/udp_input.c') diff --git a/src/vnet/udp/udp_input.c b/src/vnet/udp/udp_input.c index 936d94d69ce..ad86f439fd7 100644 --- a/src/vnet/udp/udp_input.c +++ b/src/vnet/udp/udp_input.c @@ -110,6 +110,7 @@ udp46_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node, int wrote0; void *rmt_addr, *lcl_addr; session_dgram_hdr_t hdr0; + u8 queue_event = 1; /* speculatively enqueue b0 to the current next frame */ bi0 = from[0]; @@ -182,6 +183,8 @@ udp46_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node, session_dgram_connect_notify (&new_uc0->connection, s0->thread_index, &s0); tc0 = &new_uc0->connection; + uc0 = new_uc0; + queue_event = 0; } else s0->session_state = SESSION_STATE_READY; @@ -254,7 +257,7 @@ udp46_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node, clib_spinlock_lock (&uc0->rx_lock); wrote0 = session_enqueue_dgram_connection (s0, &hdr0, b0, TRANSPORT_PROTO_UDP, - 1 /* queue evt */ ); + queue_event); clib_spinlock_unlock (&uc0->rx_lock); ASSERT (wrote0 > 0); -- cgit 1.2.3-korg