summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/vnet/adj/adj.c4
-rw-r--r--src/vnet/adj/adj.h8
-rw-r--r--src/vnet/adj/adj_mcast.c7
-rw-r--r--src/vnet/ip/lookup.c7
4 files changed, 23 insertions, 3 deletions
diff --git a/src/vnet/adj/adj.c b/src/vnet/adj/adj.c
index bafa33618cb..0966d97cc6d 100644
--- a/src/vnet/adj/adj.c
+++ b/src/vnet/adj/adj.c
@@ -139,6 +139,10 @@ format_ip_adjacency (u8 * s, va_list * args)
adj_index = va_arg (*args, u32);
fiaf = va_arg (*args, format_ip_adjacency_flags_t);
+
+ if (!adj_is_valid(adj_index))
+ return format(s, "<invalid adjacency>");
+
adj = adj_get(adj_index);
switch (adj->lookup_next_index)
diff --git a/src/vnet/adj/adj.h b/src/vnet/adj/adj.h
index fb3dc368db0..4c38b041b61 100644
--- a/src/vnet/adj/adj.h
+++ b/src/vnet/adj/adj.h
@@ -432,7 +432,13 @@ extern int adj_per_adj_counters;
static inline ip_adjacency_t *
adj_get (adj_index_t adj_index)
{
- return (vec_elt_at_index(adj_pool, adj_index));
+ return (pool_elt_at_index(adj_pool, adj_index));
+}
+
+static inline int
+adj_is_valid(adj_index_t adj_index)
+{
+ return !(pool_is_free_index(adj_pool, adj_index));
}
/**
diff --git a/src/vnet/adj/adj_mcast.c b/src/vnet/adj/adj_mcast.c
index 4454afec630..c94d28e8713 100644
--- a/src/vnet/adj/adj_mcast.c
+++ b/src/vnet/adj/adj_mcast.c
@@ -329,7 +329,12 @@ format_adj_mcast (u8* s, va_list *ap)
{
index_t index = va_arg(*ap, index_t);
CLIB_UNUSED(u32 indent) = va_arg(*ap, u32);
- ip_adjacency_t * adj = adj_get(index);
+ ip_adjacency_t * adj;
+
+ if (!adj_is_valid(index))
+ return format(s, "<invalid adjacency>");
+
+ adj = adj_get(index);
s = format(s, "%U-mcast: ",
format_fib_protocol, adj->ia_nh_proto);
diff --git a/src/vnet/ip/lookup.c b/src/vnet/ip/lookup.c
index 60cedac57d8..43d61d39ee0 100644
--- a/src/vnet/ip/lookup.c
+++ b/src/vnet/ip/lookup.c
@@ -261,7 +261,12 @@ format_ip_adjacency_packet_data (u8 * s, va_list * args)
u32 adj_index = va_arg (*args, u32);
u8 *packet_data = va_arg (*args, u8 *);
u32 n_packet_data_bytes = va_arg (*args, u32);
- ip_adjacency_t *adj = adj_get (adj_index);
+ ip_adjacency_t *adj;
+
+ if (!adj_is_valid (adj_index))
+ return format (s, "<invalid adjacency>");
+
+ adj = adj_get (adj_index);
switch (adj->lookup_next_index)
{