diff options
author | Neale Ranns <nranns@cisco.com> | 2016-11-03 14:15:28 -0700 |
---|---|---|
committer | Dave Barach <openvpp@barachs.net> | 2016-11-03 22:15:15 +0000 |
commit | bcc889cd0892a4dba9a06fc3c0ba49356c7220a4 (patch) | |
tree | 4cb6e312c627d1f4369bcd6f9a6869254a9533cc /vnet/vnet/fib/fib_path_list.c | |
parent | 931be3aca223e094241a92ae7184ff97375fa155 (diff) |
Crash when adding duplicate paths
Change-Id: Icd29c9013ae70f5444eb940aff4f08589e755f48
Signed-off-by: Neale Ranns <nranns@cisco.com>
Diffstat (limited to 'vnet/vnet/fib/fib_path_list.c')
-rw-r--r-- | vnet/vnet/fib/fib_path_list.c | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/vnet/vnet/fib/fib_path_list.c b/vnet/vnet/fib/fib_path_list.c index 5cd5096b7d8..4d695d63d51 100644 --- a/vnet/vnet/fib/fib_path_list.c +++ b/vnet/vnet/fib/fib_path_list.c @@ -762,8 +762,9 @@ fib_path_list_copy_and_path_add (fib_node_index_t orig_path_list_index, fib_path_list_flags_t flags, const fib_route_path_t *rpaths) { - fib_node_index_t path_index, path_list_index, *orig_path_index; + fib_node_index_t path_index, new_path_index, *orig_path_index; fib_path_list_t *path_list, *orig_path_list; + fib_node_index_t path_list_index; fib_node_index_t pi; ASSERT(1 == vec_len(rpaths)); @@ -784,16 +785,30 @@ fib_path_list_copy_and_path_add (fib_node_index_t orig_path_list_index, vec_validate(path_list->fpl_paths, vec_len(orig_path_list->fpl_paths)); pi = 0; + new_path_index = fib_path_create(path_list_index, + path_list->fpl_nh_proto, + fib_path_list_flags_2_path_flags(flags), + rpaths); + vec_foreach (orig_path_index, orig_path_list->fpl_paths) { - path_index = fib_path_copy(*orig_path_index, path_list_index); - path_list->fpl_paths[pi++] = path_index; + /* + * don't add duplicate paths + * In the unlikely event the path is a duplicate, then we'll + * find a matching path-list later and this one will be toast. + */ + if (0 != fib_path_cmp(new_path_index, *orig_path_index)) + { + path_index = fib_path_copy(*orig_path_index, path_list_index); + path_list->fpl_paths[pi++] = path_index; + } + else + { + _vec_len(path_list->fpl_paths) = vec_len(orig_path_list->fpl_paths); + } } - path_index = fib_path_create(path_list_index, - path_list->fpl_nh_proto, - fib_path_list_flags_2_path_flags(flags), - rpaths); - path_list->fpl_paths[pi] = path_index; + + path_list->fpl_paths[pi] = new_path_index; /* * we sort the paths since the key for the path-list is |