summaryrefslogtreecommitdiffstats
path: root/net/ipv4
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4')
-rw-r--r--net/ipv4/ip_forward.c3
-rw-r--r--net/ipv4/ip_sockglue.c8
-rw-r--r--net/ipv4/ping.c5
-rw-r--r--net/ipv4/route.c9
-rw-r--r--net/ipv4/udp_diag.c4
5 files changed, 16 insertions, 13 deletions
diff --git a/net/ipv4/ip_forward.c b/net/ipv4/ip_forward.c
index 3a83ce5efa80..787b3c294ce6 100644
--- a/net/ipv4/ip_forward.c
+++ b/net/ipv4/ip_forward.c
@@ -129,7 +129,8 @@ int ip_forward(struct sk_buff *skb)
129 * We now generate an ICMP HOST REDIRECT giving the route 129 * We now generate an ICMP HOST REDIRECT giving the route
130 * we calculated. 130 * we calculated.
131 */ 131 */
132 if (rt->rt_flags&RTCF_DOREDIRECT && !opt->srr && !skb_sec_path(skb)) 132 if (IPCB(skb)->flags & IPSKB_DOREDIRECT && !opt->srr &&
133 !skb_sec_path(skb))
133 ip_rt_send_redirect(skb); 134 ip_rt_send_redirect(skb);
134 135
135 skb->priority = rt_tos2priority(iph->tos); 136 skb->priority = rt_tos2priority(iph->tos);
diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c
index a317797b3cd0..db5e0f81ce0a 100644
--- a/net/ipv4/ip_sockglue.c
+++ b/net/ipv4/ip_sockglue.c
@@ -494,17 +494,13 @@ int ip_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len)
494 494
495 memcpy(&errhdr.ee, &serr->ee, sizeof(struct sock_extended_err)); 495 memcpy(&errhdr.ee, &serr->ee, sizeof(struct sock_extended_err));
496 sin = &errhdr.offender; 496 sin = &errhdr.offender;
497 sin->sin_family = AF_UNSPEC; 497 memset(sin, 0, sizeof(*sin));
498 498
499 if (serr->ee.ee_origin == SO_EE_ORIGIN_ICMP || 499 if (serr->ee.ee_origin == SO_EE_ORIGIN_ICMP ||
500 ipv4_pktinfo_prepare_errqueue(sk, skb, serr->ee.ee_origin)) { 500 ipv4_pktinfo_prepare_errqueue(sk, skb, serr->ee.ee_origin)) {
501 struct inet_sock *inet = inet_sk(sk);
502
503 sin->sin_family = AF_INET; 501 sin->sin_family = AF_INET;
504 sin->sin_addr.s_addr = ip_hdr(skb)->saddr; 502 sin->sin_addr.s_addr = ip_hdr(skb)->saddr;
505 sin->sin_port = 0; 503 if (inet_sk(sk)->cmsg_flags)
506 memset(&sin->sin_zero, 0, sizeof(sin->sin_zero));
507 if (inet->cmsg_flags)
508 ip_cmsg_recv(msg, skb); 504 ip_cmsg_recv(msg, skb);
509 } 505 }
510 506
diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c
index c0d82f78d364..2a3720fb5a5f 100644
--- a/net/ipv4/ping.c
+++ b/net/ipv4/ping.c
@@ -966,8 +966,11 @@ bool ping_rcv(struct sk_buff *skb)
966 966
967 sk = ping_lookup(net, skb, ntohs(icmph->un.echo.id)); 967 sk = ping_lookup(net, skb, ntohs(icmph->un.echo.id));
968 if (sk != NULL) { 968 if (sk != NULL) {
969 struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC);
970
969 pr_debug("rcv on socket %p\n", sk); 971 pr_debug("rcv on socket %p\n", sk);
970 ping_queue_rcv_skb(sk, skb_get(skb)); 972 if (skb2)
973 ping_queue_rcv_skb(sk, skb2);
971 sock_put(sk); 974 sock_put(sk);
972 return true; 975 return true;
973 } 976 }
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 2000110c75f0..0c63b2abd873 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -1567,11 +1567,10 @@ static int __mkroute_input(struct sk_buff *skb,
1567 1567
1568 do_cache = res->fi && !itag; 1568 do_cache = res->fi && !itag;
1569 if (out_dev == in_dev && err && IN_DEV_TX_REDIRECTS(out_dev) && 1569 if (out_dev == in_dev && err && IN_DEV_TX_REDIRECTS(out_dev) &&
1570 skb->protocol == htons(ETH_P_IP) &&
1570 (IN_DEV_SHARED_MEDIA(out_dev) || 1571 (IN_DEV_SHARED_MEDIA(out_dev) ||
1571 inet_addr_onlink(out_dev, saddr, FIB_RES_GW(*res)))) { 1572 inet_addr_onlink(out_dev, saddr, FIB_RES_GW(*res))))
1572 flags |= RTCF_DOREDIRECT; 1573 IPCB(skb)->flags |= IPSKB_DOREDIRECT;
1573 do_cache = false;
1574 }
1575 1574
1576 if (skb->protocol != htons(ETH_P_IP)) { 1575 if (skb->protocol != htons(ETH_P_IP)) {
1577 /* Not IP (i.e. ARP). Do not create route, if it is 1576 /* Not IP (i.e. ARP). Do not create route, if it is
@@ -2316,6 +2315,8 @@ static int rt_fill_info(struct net *net, __be32 dst, __be32 src,
2316 r->rtm_flags = (rt->rt_flags & ~0xFFFF) | RTM_F_CLONED; 2315 r->rtm_flags = (rt->rt_flags & ~0xFFFF) | RTM_F_CLONED;
2317 if (rt->rt_flags & RTCF_NOTIFY) 2316 if (rt->rt_flags & RTCF_NOTIFY)
2318 r->rtm_flags |= RTM_F_NOTIFY; 2317 r->rtm_flags |= RTM_F_NOTIFY;
2318 if (IPCB(skb)->flags & IPSKB_DOREDIRECT)
2319 r->rtm_flags |= RTCF_DOREDIRECT;
2319 2320
2320 if (nla_put_be32(skb, RTA_DST, dst)) 2321 if (nla_put_be32(skb, RTA_DST, dst))
2321 goto nla_put_failure; 2322 goto nla_put_failure;
diff --git a/net/ipv4/udp_diag.c b/net/ipv4/udp_diag.c
index 7927db0a9279..4a000f1dd757 100644
--- a/net/ipv4/udp_diag.c
+++ b/net/ipv4/udp_diag.c
@@ -99,11 +99,13 @@ static void udp_dump(struct udp_table *table, struct sk_buff *skb, struct netlin
99 s_slot = cb->args[0]; 99 s_slot = cb->args[0];
100 num = s_num = cb->args[1]; 100 num = s_num = cb->args[1];
101 101
102 for (slot = s_slot; slot <= table->mask; num = s_num = 0, slot++) { 102 for (slot = s_slot; slot <= table->mask; s_num = 0, slot++) {
103 struct sock *sk; 103 struct sock *sk;
104 struct hlist_nulls_node *node; 104 struct hlist_nulls_node *node;
105 struct udp_hslot *hslot = &table->hash[slot]; 105 struct udp_hslot *hslot = &table->hash[slot];
106 106
107 num = 0;
108
107 if (hlist_nulls_empty(&hslot->head)) 109 if (hlist_nulls_empty(&hslot->head))
108 continue; 110 continue;
109 111