shithub: riscv

Download patch

ref: 688c1f15cdaa5fcad19d9fddb30e1c555bfc59e0
parent: 9d30cabbafc28fc0a28bb3716274dc3716e6cc27
author: cinap_lenrek <[email protected]>
date: Sun Feb 21 11:36:41 EST 2016

fix ipv6 icmphostunr() locking and memory free bugs (from sources)

--- a/sys/src/9/ip/icmp6.c
+++ b/sys/src/9/ip/icmp6.c
@@ -432,7 +432,7 @@
 	p = (Ip6hdr *)bp->rp;
 
 	if(isv6mcast(p->src))
-		goto clean;
+		goto freebl;
 
 	nbp = newIPICMP(sz);
 	np = (IPICMP *)nbp->rp;
@@ -439,16 +439,12 @@
 
 	rlock(ifc);
 	if(ipv6anylocal(ifc, np->src))
-		netlog(f, Logicmp, "send icmphostunr -> src %I dst %I\n",
-			p->src, p->dst);
+		netlog(f, Logicmp, "send icmphostunr -> src %I dst %I\n", p->src, p->dst);
 	else {
-		netlog(f, Logicmp, "icmphostunr fail -> src %I dst %I\n",
-			p->src, p->dst);
+		netlog(f, Logicmp, "icmphostunr fail -> src %I dst %I\n", p->src, p->dst);
+		runlock(ifc);
 		freeblist(nbp);
-		if(free)
-			goto clean;
-		else
-			return;
+		goto freebl;
 	}
 
 	memmove(np->dst, p->src, IPaddrlen);
@@ -462,14 +458,12 @@
 
 	if(free)
 		ipiput6(f, ifc, nbp);
-	else {
+	else 
 		ipoput6(f, nbp, 0, MAXTTL, DFLTTOS, nil);
-		return;
-	}
-
-clean:
 	runlock(ifc);
-	freeblist(bp);
+freebl:
+	if(free)
+		freeblist(bp);
 }
 
 extern void