svn commit: r294089 - head/sys/net

Alexander V. Chernikov melifaro at FreeBSD.org
Fri Jan 15 13:47:13 UTC 2016


Author: melifaro
Date: Fri Jan 15 13:47:11 2016
New Revision: 294089
URL: https://svnweb.freebsd.org/changeset/base/294089

Log:
  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

Modified:
  head/sys/net/radix_mpath.c

Modified: head/sys/net/radix_mpath.c
==============================================================================
--- head/sys/net/radix_mpath.c	Fri Jan 15 12:09:15 2016	(r294088)
+++ head/sys/net/radix_mpath.c	Fri Jan 15 13:47:11 2016	(r294089)
@@ -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 */


More information about the svn-src-all mailing list