From e682b020840a9035beacd24cba4f6baabcfaf5ff Mon Sep 17 00:00:00 2001 From: Vladimir Medvedkin Date: Tue, 8 Dec 2020 17:00:04 +0000 Subject: [PATCH] rib: fix insertion in some cases According to GCC documentation for __builtin_clz: Returns the number of leading 0-bits in x, starting at the most significant bit position. If x is 0, the result is undefined. __builtin_clz will be called with 0 if the existing prefix address matches the one we want to insert. Fixes: 5a5793a5ffa2 ("rib: add RIB library") Cc: stable@dpdk.org Reported-by: David Marchand Signed-off-by: Vladimir Medvedkin --- lib/librte_rib/rte_rib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/librte_rib/rte_rib.c b/lib/librte_rib/rte_rib.c index 2a370d7f84..6c29e1c49a 100644 --- a/lib/librte_rib/rte_rib.c +++ b/lib/librte_rib/rte_rib.c @@ -301,7 +301,7 @@ rte_rib_insert(struct rte_rib *rib, uint32_t ip, uint8_t depth) /* closest node found, new_node should be inserted in the middle */ common_depth = RTE_MIN(depth, (*tmp)->depth); common_prefix = ip ^ (*tmp)->ip; - d = __builtin_clz(common_prefix); + d = (common_prefix == 0) ? 32 : __builtin_clz(common_prefix); common_depth = RTE_MIN(d, common_depth); common_prefix = ip & rte_rib_depth_to_mask(common_depth); -- 2.20.1