Fix for invalid check of SPARSE_VEC_INVALID_INDEX 99/2599/2
authorAlex Popovsky <apopovsk@cisco.com>
Fri, 2 Sep 2016 03:57:45 +0000 (20:57 -0700)
committerJohn Lo <loj@cisco.com>
Fri, 2 Sep 2016 10:46:15 +0000 (10:46 +0000)
When looking up a UDP port / GRE protocol in the sparse vectors
next_by_dst_port / next_by_protocol a data from the vector was
tested for SPARSE_VEC_INVALID_INDEX instead of sparse index itself.

This doesn’t matter for most cases since V[0] = 0 is true for all
sparse vectors. This however could cause an issue when a valid
sparse entry e.g. V[1234] = 0, with data (0) mistakenly passing
the test for SPARSE_VEC_INVALID_INDEX, while the index itself (1234)
is a valid index.

Change-Id: I04818cc43efeae047a4dae79078157d48b8c359c
Signed-off-by: Alex Popovsky <apopovsk@cisco.com>
vnet/vnet/gre/node.c
vnet/vnet/ip/udp_local.c

index d226c2f..97f9dac 100644 (file)
@@ -145,8 +145,8 @@ gre_input (vlib_main_t * vm,
           next0 = vec_elt(rt->next_by_protocol, i0);
           next1 = vec_elt(rt->next_by_protocol, i1);
 
-         b0->error = node->errors[next0 == SPARSE_VEC_INVALID_INDEX ? GRE_ERROR_UNKNOWN_PROTOCOL : GRE_ERROR_NONE];
-         b1->error = node->errors[next1 == SPARSE_VEC_INVALID_INDEX ? GRE_ERROR_UNKNOWN_PROTOCOL : GRE_ERROR_NONE];
+         b0->error = node->errors[i0 == SPARSE_VEC_INVALID_INDEX ? GRE_ERROR_UNKNOWN_PROTOCOL : GRE_ERROR_NONE];
+         b1->error = node->errors[i1 == SPARSE_VEC_INVALID_INDEX ? GRE_ERROR_UNKNOWN_PROTOCOL : GRE_ERROR_NONE];
           
           version0 = clib_net_to_host_u16 (h0->flags_and_version);
           verr0 =  version0 & GRE_VERSION_MASK;
@@ -317,7 +317,7 @@ drop1:
           next0 = vec_elt(rt->next_by_protocol, i0);
 
          b0->error = 
-              node->errors[next0 == SPARSE_VEC_INVALID_INDEX 
+              node->errors[i0 == SPARSE_VEC_INVALID_INDEX 
                            ? GRE_ERROR_UNKNOWN_PROTOCOL : GRE_ERROR_NONE];
          
           version0 = clib_net_to_host_u16 (h0->flags_and_version);
index 9940323..7676630 100644 (file)
@@ -179,7 +179,7 @@ udp46_input_inline (vlib_main_t * vm,
           next0 = (error0 == 0) ? vec_elt(rt->next_by_dst_port, i0) : next0;
           next1 = (error1 == 0) ? vec_elt(rt->next_by_dst_port, i1) : next1;
 
-          if (PREDICT_FALSE(next0 == SPARSE_VEC_INVALID_INDEX))
+          if (PREDICT_FALSE(i0 == SPARSE_VEC_INVALID_INDEX))
             {
               // move the pointer back so icmp-error can find the
               // ip packet header
@@ -206,7 +206,7 @@ udp46_input_inline (vlib_main_t * vm,
               vlib_buffer_advance (b0, sizeof (*h0));
             }
 
-          if (PREDICT_FALSE(next1 == SPARSE_VEC_INVALID_INDEX))
+          if (PREDICT_FALSE(i1 == SPARSE_VEC_INVALID_INDEX))
             {
               // move the pointer back so icmp-error can find the
               // ip packet header
@@ -303,7 +303,7 @@ udp46_input_inline (vlib_main_t * vm,
               i0 = sparse_vec_index (rt->next_by_dst_port, h0->dst_port);
               next0 = vec_elt(rt->next_by_dst_port, i0);
 
-              if (PREDICT_FALSE(next0 == SPARSE_VEC_INVALID_INDEX))
+              if (PREDICT_FALSE(i0 == SPARSE_VEC_INVALID_INDEX))
                 {
                   // move the pointer back so icmp-error can find the
                   // ip packet header