|
@@ -483,7 +483,7 @@ int ip_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len)
|
|
|
|
|
|
serr = SKB_EXT_ERR(skb);
|
|
serr = SKB_EXT_ERR(skb);
|
|
|
|
|
|
- if (sin) {
|
|
|
|
|
|
+ if (sin && skb->len) {
|
|
sin->sin_family = AF_INET;
|
|
sin->sin_family = AF_INET;
|
|
sin->sin_addr.s_addr = *(__be32 *)(skb_network_header(skb) +
|
|
sin->sin_addr.s_addr = *(__be32 *)(skb_network_header(skb) +
|
|
serr->addr_offset);
|
|
serr->addr_offset);
|
|
@@ -496,8 +496,9 @@ int ip_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len)
|
|
sin = &errhdr.offender;
|
|
sin = &errhdr.offender;
|
|
memset(sin, 0, sizeof(*sin));
|
|
memset(sin, 0, sizeof(*sin));
|
|
|
|
|
|
- if (serr->ee.ee_origin == SO_EE_ORIGIN_ICMP ||
|
|
|
|
- ipv4_pktinfo_prepare_errqueue(sk, skb, serr->ee.ee_origin)) {
|
|
|
|
|
|
+ if (skb->len &&
|
|
|
|
+ (serr->ee.ee_origin == SO_EE_ORIGIN_ICMP ||
|
|
|
|
+ ipv4_pktinfo_prepare_errqueue(sk, skb, serr->ee.ee_origin))) {
|
|
sin->sin_family = AF_INET;
|
|
sin->sin_family = AF_INET;
|
|
sin->sin_addr.s_addr = ip_hdr(skb)->saddr;
|
|
sin->sin_addr.s_addr = ip_hdr(skb)->saddr;
|
|
if (inet_sk(sk)->cmsg_flags)
|
|
if (inet_sk(sk)->cmsg_flags)
|