ipv6: Use container_of macro instead of magic number to get ipv6 header.
authorYOSHIFUJI Hideaki / 吉藤英明 <yoshfuji@linux-ipv6.org>
Tue, 8 Jan 2013 06:44:23 +0000 (06:44 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 10 Jan 2013 07:59:53 +0000 (23:59 -0800)
In ipv6_recv_error(), addr_offset points to daddr field of the ip header.
To get ipv6 header, use container_of() macro instead of substracting magic
number (24).

Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/datagram.c

index 8edf2601065af07790500809b8dee9fad0fc8eaa..56b692bb94a798d3f84881cc066b9a1173d7e399 100644 (file)
@@ -356,12 +356,11 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len)
                sin->sin6_port = serr->port;
                sin->sin6_scope_id = 0;
                if (skb->protocol == htons(ETH_P_IPV6)) {
-                       sin->sin6_addr =
-                               *(struct in6_addr *)(nh + serr->addr_offset);
+                       const struct ipv6hdr *ip6h = container_of((struct in6_addr *)(nh + serr->addr_offset),
+                                                                 struct ipv6hdr, daddr);
+                       sin->sin6_addr = ip6h->daddr;
                        if (np->sndflow)
-                               sin->sin6_flowinfo =
-                                       (*(__be32 *)(nh + serr->addr_offset - 24) &
-                                        IPV6_FLOWINFO_MASK);
+                               sin->sin6_flowinfo = *(__be32 *)ip6h & IPV6_FLOWINFO_MASK;
                        if (ipv6_addr_type(&sin->sin6_addr) & IPV6_ADDR_LINKLOCAL)
                                sin->sin6_scope_id = IP6CB(skb)->iif;
                } else {