diff options
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/ip_forward.c | 3 | ||||
-rw-r--r-- | net/ipv4/ip_sockglue.c | 8 | ||||
-rw-r--r-- | net/ipv4/ping.c | 5 | ||||
-rw-r--r-- | net/ipv4/route.c | 9 | ||||
-rw-r--r-- | net/ipv4/udp_diag.c | 4 |
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 | ||