aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEyal Bari <ebari@cisco.com>2018-07-22 12:45:15 +0300
committerFlorin Coras <florin.coras@gmail.com>2018-07-24 15:15:25 +0000
commit456ded496f93eb8156dc6e7b5a81d4a3aa604f60 (patch)
tree426faba1e7096e963e3d36c61d19c0fea9175205
parentc16a23c596169e76ee2b5091e2605c543659393d (diff)
fix vector index range checks (VPP-1353)
Change-Id: I63c36644c9d93f2c3ec6606ca0205b407499de4e Signed-off-by: Eyal Bari <ebari@cisco.com> (cherry picked from commit cd30774fa9280736ffaea3e9a51948593e8eebc2) Signed-off-by: John Lo <loj@cisco.com>
-rw-r--r--src/plugins/acl/acl.c4
-rw-r--r--src/plugins/acl/session_inlines.h11
-rw-r--r--src/plugins/dpdk/device/flow.c5
-rw-r--r--src/svm/svm_fifo_segment.c2
-rw-r--r--src/vnet/gre/interface.c2
-rw-r--r--src/vnet/ip/ip6_neighbor.c2
-rw-r--r--src/vnet/ipip/ipip.c2
-rw-r--r--src/vnet/mpls/interface.c2
-rw-r--r--src/vnet/mpls/mpls_tunnel.c2
-rw-r--r--src/vnet/unix/gdb_funcs.c2
-rw-r--r--src/vnet/util/trajectory.c2
-rw-r--r--src/vnet/vxlan/vxlan.c2
12 files changed, 16 insertions, 22 deletions
diff --git a/src/plugins/acl/acl.c b/src/plugins/acl/acl.c
index 192dc041d55..2076e5cf5c5 100644
--- a/src/plugins/acl/acl.c
+++ b/src/plugins/acl/acl.c
@@ -1413,7 +1413,7 @@ acl_interface_add_del_inout_acl (u32 sw_if_index, u8 is_add, u8 is_input,
}
else
{
- if (sw_if_index > vec_len (*pinout_acl_vec_by_sw_if_index))
+ if (sw_if_index >= vec_len (*pinout_acl_vec_by_sw_if_index))
{
rv = VNET_API_ERROR_NO_SUCH_ENTRY;
goto done;
@@ -3452,7 +3452,7 @@ macip_acl_print (acl_main_t * am, u32 macip_acl_index)
int i;
/* Don't try to print someone else's memory */
- if (macip_acl_index > vec_len (am->macip_acls))
+ if (macip_acl_index >= vec_len (am->macip_acls))
return;
macip_acl_list_t *a = vec_elt_at_index (am->macip_acls, macip_acl_index);
diff --git a/src/plugins/acl/session_inlines.h b/src/plugins/acl/session_inlines.h
index 4d5dfe7587a..0d7c1e4ace7 100644
--- a/src/plugins/acl/session_inlines.h
+++ b/src/plugins/acl/session_inlines.h
@@ -120,15 +120,10 @@ always_inline fa_session_t *
get_session_ptr (acl_main_t * am, u16 thread_index, u32 session_index)
{
acl_fa_per_worker_data_t *pw = &am->per_worker_data[thread_index];
- if (session_index > vec_len (pw->fa_sessions_pool))
- {
- return 0;
- }
+ if (session_index >= vec_len (pw->fa_sessions_pool))
+ return 0;
- fa_session_t *sess = (session_index > vec_len (pw->fa_sessions_pool)) ? 0 :
- pool_elt_at_index (pw->fa_sessions_pool,
- session_index);
- return sess;
+ return pool_elt_at_index (pw->fa_sessions_pool, session_index);
}
always_inline int
diff --git a/src/plugins/dpdk/device/flow.c b/src/plugins/dpdk/device/flow.c
index becd39704b8..351390b6d34 100644
--- a/src/plugins/dpdk/device/flow.c
+++ b/src/plugins/dpdk/device/flow.c
@@ -368,11 +368,10 @@ format_dpdk_flow (u8 * s, va_list * args)
return s;
}
- fe = vec_elt_at_index (xd->flow_entries, private_data);
-
- if (!fe)
+ if (private_data >= vec_len (xd->flow_entries))
return format (s, "unknown flow");
+ fe = vec_elt_at_index (xd->flow_entries, private_data);
s = format (s, "mark %u", fe->mark);
return s;
}
diff --git a/src/svm/svm_fifo_segment.c b/src/svm/svm_fifo_segment.c
index 7c6d80229ad..800278229c9 100644
--- a/src/svm/svm_fifo_segment.c
+++ b/src/svm/svm_fifo_segment.c
@@ -551,7 +551,7 @@ svm_fifo_segment_num_free_fifos (svm_fifo_segment_private_t * fifo_segment,
freelist_index = max_log2 (rounded_data_size)
- max_log2 (FIFO_SEGMENT_MIN_FIFO_SIZE);
- if (freelist_index > vec_len (fsh->free_fifos))
+ if (freelist_index >= vec_len (fsh->free_fifos))
return 0;
f = fsh->free_fifos[freelist_index];
diff --git a/src/vnet/gre/interface.c b/src/vnet/gre/interface.c
index 0822cd74b52..70c6c4df3b3 100644
--- a/src/vnet/gre/interface.c
+++ b/src/vnet/gre/interface.c
@@ -135,7 +135,7 @@ gre_tunnel_stack (adj_index_t ai)
adj = adj_get (ai);
sw_if_index = adj->rewrite_header.sw_if_index;
- if ((vec_len (gm->tunnel_index_by_sw_if_index) < sw_if_index) ||
+ if ((vec_len (gm->tunnel_index_by_sw_if_index) <= sw_if_index) ||
(~0 == gm->tunnel_index_by_sw_if_index[sw_if_index]))
return;
diff --git a/src/vnet/ip/ip6_neighbor.c b/src/vnet/ip/ip6_neighbor.c
index a6227fc413a..e3919383efc 100644
--- a/src/vnet/ip/ip6_neighbor.c
+++ b/src/vnet/ip/ip6_neighbor.c
@@ -4239,7 +4239,7 @@ ip6_get_ll_address (u32 sw_if_index, ip6_address_t * addr)
ip6_radv_t *radv_info;
u32 ri;
- if (vec_len (nm->if_radv_pool_index_by_sw_if_index) < sw_if_index)
+ if (vec_len (nm->if_radv_pool_index_by_sw_if_index) <= sw_if_index)
return 0;
ri = nm->if_radv_pool_index_by_sw_if_index[sw_if_index];
diff --git a/src/vnet/ipip/ipip.c b/src/vnet/ipip/ipip.c
index a47704a62e6..c49be099d9a 100644
--- a/src/vnet/ipip/ipip.c
+++ b/src/vnet/ipip/ipip.c
@@ -355,7 +355,7 @@ ipip_tunnel_t *
ipip_tunnel_db_find_by_sw_if_index (u32 sw_if_index)
{
ipip_main_t *gm = &ipip_main;
- if (vec_len (gm->tunnel_index_by_sw_if_index) < sw_if_index)
+ if (vec_len (gm->tunnel_index_by_sw_if_index) <= sw_if_index)
return NULL;
u32 ti = gm->tunnel_index_by_sw_if_index[sw_if_index];
if (ti == ~0)
diff --git a/src/vnet/mpls/interface.c b/src/vnet/mpls/interface.c
index c792d56b12e..ec541f760de 100644
--- a/src/vnet/mpls/interface.c
+++ b/src/vnet/mpls/interface.c
@@ -29,7 +29,7 @@ mpls_sw_interface_is_enabled (u32 sw_if_index)
{
mpls_main_t * mm = &mpls_main;
- if (vec_len(mm->mpls_enabled_by_sw_if_index) < sw_if_index)
+ if (vec_len(mm->mpls_enabled_by_sw_if_index) <= sw_if_index)
return (0);
return (mm->mpls_enabled_by_sw_if_index[sw_if_index]);
diff --git a/src/vnet/mpls/mpls_tunnel.c b/src/vnet/mpls/mpls_tunnel.c
index a142edf3f0a..84d569bcfee 100644
--- a/src/vnet/mpls/mpls_tunnel.c
+++ b/src/vnet/mpls/mpls_tunnel.c
@@ -52,7 +52,7 @@ static const char *mpls_tunnel_attribute_names[] = MPLS_TUNNEL_ATTRIBUTES;
static mpls_tunnel_t*
mpls_tunnel_get_from_sw_if_index (u32 sw_if_index)
{
- if ((vec_len(mpls_tunnel_db) < sw_if_index) ||
+ if ((vec_len(mpls_tunnel_db) <= sw_if_index) ||
(~0 == mpls_tunnel_db[sw_if_index]))
return (NULL);
diff --git a/src/vnet/unix/gdb_funcs.c b/src/vnet/unix/gdb_funcs.c
index 41ae3bdca67..d78773edf07 100644
--- a/src/vnet/unix/gdb_funcs.c
+++ b/src/vnet/unix/gdb_funcs.c
@@ -131,7 +131,7 @@ vlib_runtime_index_to_node_name (u32 index)
vlib_main_t *vm = vlib_get_main ();
vlib_node_main_t *nm = &vm->node_main;
- if (index > vec_len (nm->nodes))
+ if (index >= vec_len (nm->nodes))
{
fformat (stderr, "%d out of range, max %d\n", vec_len (nm->nodes));
return;
diff --git a/src/vnet/util/trajectory.c b/src/vnet/util/trajectory.c
index 91812dcba58..2538c7ee64a 100644
--- a/src/vnet/util/trajectory.c
+++ b/src/vnet/util/trajectory.c
@@ -44,7 +44,7 @@ vnet_dump_trajectory_trace (vlib_main_t * vm, u32 bi)
node_index = trace[i];
- if (node_index > vec_len (vnm->nodes))
+ if (node_index >= vec_len (vnm->nodes))
{
fformat (stderr, "Skip bogus node index %d\n", node_index);
continue;
diff --git a/src/vnet/vxlan/vxlan.c b/src/vnet/vxlan/vxlan.c
index e1ee3486b4b..f0312bed9b1 100644
--- a/src/vnet/vxlan/vxlan.c
+++ b/src/vnet/vxlan/vxlan.c
@@ -1124,7 +1124,7 @@ vnet_vxlan_get_tunnel_index (u32 sw_if_index)
{
vxlan_main_t *vxm = &vxlan_main;
- if (sw_if_index > vec_len (vxm->tunnel_index_by_sw_if_index))
+ if (sw_if_index >= vec_len (vxm->tunnel_index_by_sw_if_index))
return ~0;
return vxm->tunnel_index_by_sw_if_index[sw_if_index];
}