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