From b5e55a27a46f166f466c7996675542de645eff66 Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Thu, 10 Jan 2019 12:42:47 -0800 Subject: session: generate wrong thread errors instead of crashing Change-Id: I7e59ae718d2722c49d42b22a0874e1645a191e89 Signed-off-by: Florin Coras --- src/vnet/session/session_lookup.c | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) (limited to 'src/vnet/session/session_lookup.c') diff --git a/src/vnet/session/session_lookup.c b/src/vnet/session/session_lookup.c index c410dab121f..931c3d0f9e2 100644 --- a/src/vnet/session/session_lookup.c +++ b/src/vnet/session/session_lookup.c @@ -852,7 +852,7 @@ transport_connection_t * session_lookup_connection_wt4 (u32 fib_index, ip4_address_t * lcl, ip4_address_t * rmt, u16 lcl_port, u16 rmt_port, u8 proto, u32 thread_index, - u8 * is_filtered) + u8 * result) { session_table_t *st; session_kv4_t kv4; @@ -871,7 +871,11 @@ session_lookup_connection_wt4 (u32 fib_index, ip4_address_t * lcl, rv = clib_bihash_search_inline_16_8 (&st->v4_session_hash, &kv4); if (rv == 0) { - ASSERT ((u32) (kv4.value >> 32) == thread_index); + if (PREDICT_FALSE ((u32) (kv4.value >> 32) != thread_index)) + { + *result = SESSION_LOOKUP_RESULT_WRONG_THREAD; + return 0; + } s = session_get (kv4.value & 0xFFFFFFFFULL, thread_index); return tp_vfts[proto].get_connection (s->connection_index, thread_index); @@ -891,8 +895,11 @@ session_lookup_connection_wt4 (u32 fib_index, ip4_address_t * lcl, rmt, lcl_port, rmt_port); if (session_lookup_action_index_is_valid (action_index)) { - if ((*is_filtered = (action_index == SESSION_RULES_TABLE_ACTION_DROP))) - return 0; + if (action_index == SESSION_RULES_TABLE_ACTION_DROP) + { + *result = SESSION_LOOKUP_RESULT_FILTERED; + return 0; + } if ((s = session_lookup_action_to_session (action_index, FIB_PROTOCOL_IP4, proto))) return tp_vfts[proto].get_listener (s->connection_index); @@ -912,9 +919,8 @@ session_lookup_connection_wt4 (u32 fib_index, ip4_address_t * lcl, /** * Lookup connection with ip4 and transport layer information * - * Not optimized. This is used on the fast path so it needs to be fast. - * Thereby, duplication of code and 'hacks' allowed. Lookup logic is identical - * to that of @ref session_lookup_connection_wt4 + * Not optimized. Lookup logic is identical to that of + * @ref session_lookup_connection_wt4 * * @param fib_index index of the fib wherein the connection was received * @param lcl local ip4 address @@ -1070,7 +1076,7 @@ transport_connection_t * session_lookup_connection_wt6 (u32 fib_index, ip6_address_t * lcl, ip6_address_t * rmt, u16 lcl_port, u16 rmt_port, u8 proto, u32 thread_index, - u8 * is_filtered) + u8 * result) { session_table_t *st; stream_session_t *s; @@ -1087,6 +1093,11 @@ session_lookup_connection_wt6 (u32 fib_index, ip6_address_t * lcl, if (rv == 0) { ASSERT ((u32) (kv6.value >> 32) == thread_index); + if (PREDICT_FALSE ((u32) (kv6.value >> 32) != thread_index)) + { + *result = SESSION_LOOKUP_RESULT_WRONG_THREAD; + return 0; + } s = session_get (kv6.value & 0xFFFFFFFFULL, thread_index); return tp_vfts[proto].get_connection (s->connection_index, thread_index); @@ -1102,8 +1113,11 @@ session_lookup_connection_wt6 (u32 fib_index, ip6_address_t * lcl, rmt, lcl_port, rmt_port); if (session_lookup_action_index_is_valid (action_index)) { - if ((*is_filtered = (action_index == SESSION_RULES_TABLE_ACTION_DROP))) - return 0; + if (action_index == SESSION_RULES_TABLE_ACTION_DROP) + { + *result = SESSION_LOOKUP_RESULT_FILTERED; + return 0; + } if ((s = session_lookup_action_to_session (action_index, FIB_PROTOCOL_IP6, proto))) return tp_vfts[proto].get_listener (s->connection_index); -- cgit 1.2.3-korg