|
@@ -393,11 +393,10 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len)
|
|
|
|
|
|
memcpy(&errhdr.ee, &serr->ee, sizeof(struct sock_extended_err));
|
|
|
sin = &errhdr.offender;
|
|
|
- sin->sin6_family = AF_UNSPEC;
|
|
|
+ memset(sin, 0, sizeof(*sin));
|
|
|
+
|
|
|
if (serr->ee.ee_origin != SO_EE_ORIGIN_LOCAL) {
|
|
|
sin->sin6_family = AF_INET6;
|
|
|
- sin->sin6_flowinfo = 0;
|
|
|
- sin->sin6_port = 0;
|
|
|
if (np->rxopt.all) {
|
|
|
if (serr->ee.ee_origin != SO_EE_ORIGIN_ICMP &&
|
|
|
serr->ee.ee_origin != SO_EE_ORIGIN_ICMP6)
|
|
@@ -412,12 +411,9 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len)
|
|
|
ipv6_iface_scope_id(&sin->sin6_addr,
|
|
|
IP6CB(skb)->iif);
|
|
|
} else {
|
|
|
- struct inet_sock *inet = inet_sk(sk);
|
|
|
-
|
|
|
ipv6_addr_set_v4mapped(ip_hdr(skb)->saddr,
|
|
|
&sin->sin6_addr);
|
|
|
- sin->sin6_scope_id = 0;
|
|
|
- if (inet->cmsg_flags)
|
|
|
+ if (inet_sk(sk)->cmsg_flags)
|
|
|
ip_cmsg_recv(msg, skb);
|
|
|
}
|
|
|
}
|