diff options
Diffstat (limited to 'net/ipv6/udp.c')
-rw-r--r-- | net/ipv6/udp.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 7c3505006f8e..2596ffdeebea 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
@@ -102,7 +102,7 @@ int udp_v6_get_port(struct sock *sk, unsigned short snum) | |||
102 | return udp_lib_get_port(sk, snum, hash2_nulladdr); | 102 | return udp_lib_get_port(sk, snum, hash2_nulladdr); |
103 | } | 103 | } |
104 | 104 | ||
105 | static void udp_v6_rehash(struct sock *sk) | 105 | void udp_v6_rehash(struct sock *sk) |
106 | { | 106 | { |
107 | u16 new_hash = ipv6_portaddr_hash(sock_net(sk), | 107 | u16 new_hash = ipv6_portaddr_hash(sock_net(sk), |
108 | &sk->sk_v6_rcv_saddr, | 108 | &sk->sk_v6_rcv_saddr, |
@@ -1132,15 +1132,23 @@ static int udp_v6_send_skb(struct sk_buff *skb, struct flowi6 *fl6, | |||
1132 | const int hlen = skb_network_header_len(skb) + | 1132 | const int hlen = skb_network_header_len(skb) + |
1133 | sizeof(struct udphdr); | 1133 | sizeof(struct udphdr); |
1134 | 1134 | ||
1135 | if (hlen + cork->gso_size > cork->fragsize) | 1135 | if (hlen + cork->gso_size > cork->fragsize) { |
1136 | kfree_skb(skb); | ||
1136 | return -EINVAL; | 1137 | return -EINVAL; |
1137 | if (skb->len > cork->gso_size * UDP_MAX_SEGMENTS) | 1138 | } |
1139 | if (skb->len > cork->gso_size * UDP_MAX_SEGMENTS) { | ||
1140 | kfree_skb(skb); | ||
1138 | return -EINVAL; | 1141 | return -EINVAL; |
1139 | if (udp_sk(sk)->no_check6_tx) | 1142 | } |
1143 | if (udp_sk(sk)->no_check6_tx) { | ||
1144 | kfree_skb(skb); | ||
1140 | return -EINVAL; | 1145 | return -EINVAL; |
1146 | } | ||
1141 | if (skb->ip_summed != CHECKSUM_PARTIAL || is_udplite || | 1147 | if (skb->ip_summed != CHECKSUM_PARTIAL || is_udplite || |
1142 | dst_xfrm(skb_dst(skb))) | 1148 | dst_xfrm(skb_dst(skb))) { |
1149 | kfree_skb(skb); | ||
1143 | return -EIO; | 1150 | return -EIO; |
1151 | } | ||
1144 | 1152 | ||
1145 | skb_shinfo(skb)->gso_size = cork->gso_size; | 1153 | skb_shinfo(skb)->gso_size = cork->gso_size; |
1146 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP_L4; | 1154 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP_L4; |