]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/netinet6/icmp6.c
xnu-7195.81.3.tar.gz
[apple/xnu.git] / bsd / netinet6 / icmp6.c
index 9c9fd07c89f37db1519600ccd97a9e2f2cf72a8e..08954c8ef688dc342ffa93a72b70748ec1b8ebb0 100644 (file)
@@ -986,6 +986,7 @@ icmp6_notify_error(struct mbuf *m, int off, int icmp6len, int code)
        }
 #endif
        eip6 = (struct ip6_hdr *)(icmp6 + 1);
+       bzero(&icmp6dst, sizeof(icmp6dst));
 
        /* Detect the upper level protocol */
        {
@@ -994,7 +995,6 @@ icmp6_notify_error(struct mbuf *m, int off, int icmp6len, int code)
                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;
@@ -1080,7 +1080,7 @@ icmp6_notify_error(struct mbuf *m, int off, int icmp6len, int code)
                                        /* just ignore a bogus header */
                                        if ((rth0->ip6r0_len % 2) == 0 &&
                                            (hops = rth0->ip6r0_len / 2)) {
-                                               finaldst = (struct in6_addr *)(void *)(rth0 + 1) + (hops - 1);
+                                               icmp6dst.sin6_addr = *((struct in6_addr *)(void *)(rth0 + 1) + (hops - 1));
                                        }
                                }
                                eoff += rthlen;
@@ -1148,13 +1148,10 @@ notify:
                 */
                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;
@@ -1169,14 +1166,11 @@ notify:
                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;