diff options
author | melifaro <melifaro@FreeBSD.org> | 2016-01-15 13:47:11 +0000 |
---|---|---|
committer | melifaro <melifaro@FreeBSD.org> | 2016-01-15 13:47:11 +0000 |
commit | 5ac53a20e575001384d1acfb426a65ae8c309c24 (patch) | |
tree | a69737d72465aba284ac84c466e48215c15c8aea /sys/net | |
parent | d3825e1e52b17b8fdba1ddcdd9488dbc52da7c8e (diff) | |
download | FreeBSD-src-5ac53a20e575001384d1acfb426a65ae8c309c24.zip FreeBSD-src-5ac53a20e575001384d1acfb426a65ae8c309c24.tar.gz |
Clean up original route path selection logic a bit.
NULL pointer dereference claimed by Coverity was possible
if one (or several) next-hops for had their weights set to 0.
CID: 1348482
Diffstat (limited to 'sys/net')
-rw-r--r-- | sys/net/radix_mpath.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/sys/net/radix_mpath.c b/sys/net/radix_mpath.c index 5657400..5f40745 100644 --- a/sys/net/radix_mpath.c +++ b/sys/net/radix_mpath.c @@ -201,19 +201,20 @@ static struct rtentry * rt_mpath_selectrte(struct rtentry *rte, uint32_t hash) { struct radix_node *rn0, *rn; - u_int32_t n; + uint32_t total_weight; struct rtentry *rt; int64_t weight; /* beyond here, we use rn as the master copy */ rn0 = rn = (struct radix_node *)rte; - n = rn_mpath_count(rn0); + rt = rte; /* gw selection by Modulo-N Hash (RFC2991) XXX need improvement? */ + total_weight = rn_mpath_count(rn0); hash += hashjitter; - hash %= n; - for (weight = abs((int32_t)hash), rt = rte; - weight >= rt->rt_weight && rn; + hash %= total_weight; + for (weight = abs((int32_t)hash); + rt != NULL && weight >= rt->rt_weight; weight -= rt->rt_weight) { /* stay within the multipath routes */ |