57 lines
1.7 KiB
Diff
57 lines
1.7 KiB
Diff
--- sys/netinet6/icmp6.c.orig
|
|
+++ sys/netinet6/icmp6.c
|
|
@@ -903,6 +903,7 @@
|
|
}
|
|
#endif
|
|
eip6 = (struct ip6_hdr *)(icmp6 + 1);
|
|
+ bzero(&icmp6dst, sizeof(icmp6dst));
|
|
|
|
/* Detect the upper level protocol */
|
|
{
|
|
@@ -911,7 +912,6 @@
|
|
int eoff = off + sizeof(struct icmp6_hdr) +
|
|
sizeof(struct ip6_hdr);
|
|
struct ip6ctlparam ip6cp;
|
|
- struct in6_addr *finaldst = NULL;
|
|
int icmp6type = icmp6->icmp6_type;
|
|
struct ip6_frag *fh;
|
|
struct ip6_rthdr *rth;
|
|
@@ -994,7 +994,7 @@
|
|
/* just ignore a bogus header */
|
|
if ((rth0->ip6r0_len % 2) == 0 &&
|
|
(hops = rth0->ip6r0_len/2))
|
|
- finaldst = (struct in6_addr *)(rth0 + 1) + (hops - 1);
|
|
+ icmp6dst.sin6_addr = *((struct in6_addr *)(rth0 + 1) + (hops - 1));
|
|
}
|
|
eoff += rthlen;
|
|
nxt = rth->ip6r_nxt;
|
|
@@ -1059,13 +1059,10 @@
|
|
*/
|
|
eip6 = (struct ip6_hdr *)(icmp6 + 1);
|
|
|
|
- bzero(&icmp6dst, sizeof(icmp6dst));
|
|
icmp6dst.sin6_len = sizeof(struct sockaddr_in6);
|
|
icmp6dst.sin6_family = AF_INET6;
|
|
- if (finaldst == NULL)
|
|
+ if (IN6_IS_ADDR_UNSPECIFIED(&icmp6dst.sin6_addr))
|
|
icmp6dst.sin6_addr = eip6->ip6_dst;
|
|
- else
|
|
- icmp6dst.sin6_addr = *finaldst;
|
|
if (in6_setscope(&icmp6dst.sin6_addr, m->m_pkthdr.rcvif, NULL))
|
|
goto freeit;
|
|
bzero(&icmp6src, sizeof(icmp6src));
|
|
@@ -1077,13 +1074,11 @@
|
|
icmp6src.sin6_flowinfo =
|
|
(eip6->ip6_flow & IPV6_FLOWLABEL_MASK);
|
|
|
|
- if (finaldst == NULL)
|
|
- finaldst = &eip6->ip6_dst;
|
|
ip6cp.ip6c_m = m;
|
|
ip6cp.ip6c_icmp6 = icmp6;
|
|
ip6cp.ip6c_ip6 = (struct ip6_hdr *)(icmp6 + 1);
|
|
ip6cp.ip6c_off = eoff;
|
|
- ip6cp.ip6c_finaldst = finaldst;
|
|
+ ip6cp.ip6c_finaldst = &icmp6dst.sin6_addr;
|
|
ip6cp.ip6c_src = &icmp6src;
|
|
ip6cp.ip6c_nxt = nxt;
|
|
|