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
This commit is contained in:
Alexander V. Chernikov 2016-01-15 13:47:11 +00:00
parent ac3490fdef
commit b7d076ed19
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=294089

View File

@ -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 */