summaryrefslogtreecommitdiffstats
path: root/sys/net
diff options
context:
space:
mode:
authormelifaro <melifaro@FreeBSD.org>2016-01-15 13:47:11 +0000
committermelifaro <melifaro@FreeBSD.org>2016-01-15 13:47:11 +0000
commit5ac53a20e575001384d1acfb426a65ae8c309c24 (patch)
treea69737d72465aba284ac84c466e48215c15c8aea /sys/net
parentd3825e1e52b17b8fdba1ddcdd9488dbc52da7c8e (diff)
downloadFreeBSD-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.c11
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 */
OpenPOWER on IntegriCloud