diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/batman-adv/bat_iv_ogm.c | 6 | ||||
| -rw-r--r-- | net/bridge/br_netlink.c | 2 | ||||
| -rw-r--r-- | net/core/dev.c | 2 | ||||
| -rw-r--r-- | net/core/rtnetlink.c | 2 | ||||
| -rw-r--r-- | net/ipv4/inet_fragment.c | 20 | ||||
| -rw-r--r-- | net/ipv4/ip_fragment.c | 11 | ||||
| -rw-r--r-- | net/ipv4/ip_gre.c | 5 | ||||
| -rw-r--r-- | net/ipv4/ip_options.c | 5 | ||||
| -rw-r--r-- | net/ipv4/tcp.c | 2 | ||||
| -rw-r--r-- | net/ipv4/tcp_ipv4.c | 14 | ||||
| -rw-r--r-- | net/ipv4/tcp_output.c | 1 | ||||
| -rw-r--r-- | net/ipv6/netfilter/nf_conntrack_reasm.c | 12 | ||||
| -rw-r--r-- | net/ipv6/reassembly.c | 8 | ||||
| -rw-r--r-- | net/ipv6/tcp_ipv6.c | 7 | ||||
| -rw-r--r-- | net/nfc/llcp/llcp.c | 62 | ||||
| -rw-r--r-- | net/nfc/llcp/sock.c | 2 | ||||
| -rw-r--r-- | net/openvswitch/actions.c | 4 | ||||
| -rw-r--r-- | net/openvswitch/datapath.c | 3 | ||||
| -rw-r--r-- | net/openvswitch/flow.c | 6 | ||||
| -rw-r--r-- | net/openvswitch/vport-netdev.c | 3 | ||||
| -rw-r--r-- | net/openvswitch/vport.c | 3 | ||||
| -rw-r--r-- | net/sctp/associola.c | 2 | ||||
| -rw-r--r-- | net/sctp/sm_statefuns.c | 2 |
23 files changed, 128 insertions, 56 deletions
diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c index a0b253ecadaf..a5bb0a769eb9 100644 --- a/net/batman-adv/bat_iv_ogm.c +++ b/net/batman-adv/bat_iv_ogm.c | |||
| @@ -1288,7 +1288,8 @@ static int batadv_iv_ogm_receive(struct sk_buff *skb, | |||
| 1288 | batadv_ogm_packet = (struct batadv_ogm_packet *)packet_buff; | 1288 | batadv_ogm_packet = (struct batadv_ogm_packet *)packet_buff; |
| 1289 | 1289 | ||
| 1290 | /* unpack the aggregated packets and process them one by one */ | 1290 | /* unpack the aggregated packets and process them one by one */ |
| 1291 | do { | 1291 | while (batadv_iv_ogm_aggr_packet(buff_pos, packet_len, |
| 1292 | batadv_ogm_packet->tt_num_changes)) { | ||
| 1292 | tt_buff = packet_buff + buff_pos + BATADV_OGM_HLEN; | 1293 | tt_buff = packet_buff + buff_pos + BATADV_OGM_HLEN; |
| 1293 | 1294 | ||
| 1294 | batadv_iv_ogm_process(ethhdr, batadv_ogm_packet, tt_buff, | 1295 | batadv_iv_ogm_process(ethhdr, batadv_ogm_packet, tt_buff, |
| @@ -1299,8 +1300,7 @@ static int batadv_iv_ogm_receive(struct sk_buff *skb, | |||
| 1299 | 1300 | ||
| 1300 | packet_pos = packet_buff + buff_pos; | 1301 | packet_pos = packet_buff + buff_pos; |
| 1301 | batadv_ogm_packet = (struct batadv_ogm_packet *)packet_pos; | 1302 | batadv_ogm_packet = (struct batadv_ogm_packet *)packet_pos; |
| 1302 | } while (batadv_iv_ogm_aggr_packet(buff_pos, packet_len, | 1303 | } |
| 1303 | batadv_ogm_packet->tt_num_changes)); | ||
| 1304 | 1304 | ||
| 1305 | kfree_skb(skb); | 1305 | kfree_skb(skb); |
| 1306 | return NET_RX_SUCCESS; | 1306 | return NET_RX_SUCCESS; |
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c index 27aa3ee517ce..299fc5f40a26 100644 --- a/net/bridge/br_netlink.c +++ b/net/bridge/br_netlink.c | |||
| @@ -29,6 +29,7 @@ static inline size_t br_port_info_size(void) | |||
| 29 | + nla_total_size(1) /* IFLA_BRPORT_MODE */ | 29 | + nla_total_size(1) /* IFLA_BRPORT_MODE */ |
| 30 | + nla_total_size(1) /* IFLA_BRPORT_GUARD */ | 30 | + nla_total_size(1) /* IFLA_BRPORT_GUARD */ |
| 31 | + nla_total_size(1) /* IFLA_BRPORT_PROTECT */ | 31 | + nla_total_size(1) /* IFLA_BRPORT_PROTECT */ |
| 32 | + nla_total_size(1) /* IFLA_BRPORT_FAST_LEAVE */ | ||
| 32 | + 0; | 33 | + 0; |
| 33 | } | 34 | } |
| 34 | 35 | ||
| @@ -329,6 +330,7 @@ static int br_setport(struct net_bridge_port *p, struct nlattr *tb[]) | |||
| 329 | br_set_port_flag(p, tb, IFLA_BRPORT_MODE, BR_HAIRPIN_MODE); | 330 | br_set_port_flag(p, tb, IFLA_BRPORT_MODE, BR_HAIRPIN_MODE); |
| 330 | br_set_port_flag(p, tb, IFLA_BRPORT_GUARD, BR_BPDU_GUARD); | 331 | br_set_port_flag(p, tb, IFLA_BRPORT_GUARD, BR_BPDU_GUARD); |
| 331 | br_set_port_flag(p, tb, IFLA_BRPORT_FAST_LEAVE, BR_MULTICAST_FAST_LEAVE); | 332 | br_set_port_flag(p, tb, IFLA_BRPORT_FAST_LEAVE, BR_MULTICAST_FAST_LEAVE); |
| 333 | br_set_port_flag(p, tb, IFLA_BRPORT_PROTECT, BR_ROOT_BLOCK); | ||
| 332 | 334 | ||
| 333 | if (tb[IFLA_BRPORT_COST]) { | 335 | if (tb[IFLA_BRPORT_COST]) { |
| 334 | err = br_stp_set_path_cost(p, nla_get_u32(tb[IFLA_BRPORT_COST])); | 336 | err = br_stp_set_path_cost(p, nla_get_u32(tb[IFLA_BRPORT_COST])); |
diff --git a/net/core/dev.c b/net/core/dev.c index dffbef70cd31..d540ced1f6c6 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -2219,9 +2219,9 @@ struct sk_buff *skb_mac_gso_segment(struct sk_buff *skb, | |||
| 2219 | struct sk_buff *segs = ERR_PTR(-EPROTONOSUPPORT); | 2219 | struct sk_buff *segs = ERR_PTR(-EPROTONOSUPPORT); |
| 2220 | struct packet_offload *ptype; | 2220 | struct packet_offload *ptype; |
| 2221 | __be16 type = skb->protocol; | 2221 | __be16 type = skb->protocol; |
| 2222 | int vlan_depth = ETH_HLEN; | ||
| 2222 | 2223 | ||
| 2223 | while (type == htons(ETH_P_8021Q)) { | 2224 | while (type == htons(ETH_P_8021Q)) { |
| 2224 | int vlan_depth = ETH_HLEN; | ||
| 2225 | struct vlan_hdr *vh; | 2225 | struct vlan_hdr *vh; |
| 2226 | 2226 | ||
| 2227 | if (unlikely(!pskb_may_pull(skb, vlan_depth + VLAN_HLEN))) | 2227 | if (unlikely(!pskb_may_pull(skb, vlan_depth + VLAN_HLEN))) |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index a585d45cc9d9..5fb8d7e47294 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
| @@ -2621,7 +2621,7 @@ static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
| 2621 | struct rtattr *attr = (void *)nlh + NLMSG_ALIGN(min_len); | 2621 | struct rtattr *attr = (void *)nlh + NLMSG_ALIGN(min_len); |
| 2622 | 2622 | ||
| 2623 | while (RTA_OK(attr, attrlen)) { | 2623 | while (RTA_OK(attr, attrlen)) { |
| 2624 | unsigned int flavor = attr->rta_type; | 2624 | unsigned int flavor = attr->rta_type & NLA_TYPE_MASK; |
| 2625 | if (flavor) { | 2625 | if (flavor) { |
| 2626 | if (flavor > rta_max[sz_idx]) | 2626 | if (flavor > rta_max[sz_idx]) |
| 2627 | return -EINVAL; | 2627 | return -EINVAL; |
diff --git a/net/ipv4/inet_fragment.c b/net/ipv4/inet_fragment.c index 245ae078a07f..f4fd23de9b13 100644 --- a/net/ipv4/inet_fragment.c +++ b/net/ipv4/inet_fragment.c | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include <linux/rtnetlink.h> | 21 | #include <linux/rtnetlink.h> |
| 22 | #include <linux/slab.h> | 22 | #include <linux/slab.h> |
| 23 | 23 | ||
| 24 | #include <net/sock.h> | ||
| 24 | #include <net/inet_frag.h> | 25 | #include <net/inet_frag.h> |
| 25 | 26 | ||
| 26 | static void inet_frag_secret_rebuild(unsigned long dummy) | 27 | static void inet_frag_secret_rebuild(unsigned long dummy) |
| @@ -277,6 +278,7 @@ struct inet_frag_queue *inet_frag_find(struct netns_frags *nf, | |||
| 277 | __releases(&f->lock) | 278 | __releases(&f->lock) |
| 278 | { | 279 | { |
| 279 | struct inet_frag_queue *q; | 280 | struct inet_frag_queue *q; |
| 281 | int depth = 0; | ||
| 280 | 282 | ||
| 281 | hlist_for_each_entry(q, &f->hash[hash], list) { | 283 | hlist_for_each_entry(q, &f->hash[hash], list) { |
| 282 | if (q->net == nf && f->match(q, key)) { | 284 | if (q->net == nf && f->match(q, key)) { |
| @@ -284,9 +286,25 @@ struct inet_frag_queue *inet_frag_find(struct netns_frags *nf, | |||
| 284 | read_unlock(&f->lock); | 286 | read_unlock(&f->lock); |
| 285 | return q; | 287 | return q; |
| 286 | } | 288 | } |
| 289 | depth++; | ||
| 287 | } | 290 | } |
| 288 | read_unlock(&f->lock); | 291 | read_unlock(&f->lock); |
| 289 | 292 | ||
| 290 | return inet_frag_create(nf, f, key); | 293 | if (depth <= INETFRAGS_MAXDEPTH) |
| 294 | return inet_frag_create(nf, f, key); | ||
| 295 | else | ||
| 296 | return ERR_PTR(-ENOBUFS); | ||
| 291 | } | 297 | } |
| 292 | EXPORT_SYMBOL(inet_frag_find); | 298 | EXPORT_SYMBOL(inet_frag_find); |
| 299 | |||
| 300 | void inet_frag_maybe_warn_overflow(struct inet_frag_queue *q, | ||
| 301 | const char *prefix) | ||
| 302 | { | ||
| 303 | static const char msg[] = "inet_frag_find: Fragment hash bucket" | ||
| 304 | " list length grew over limit " __stringify(INETFRAGS_MAXDEPTH) | ||
| 305 | ". Dropping fragment.\n"; | ||
| 306 | |||
| 307 | if (PTR_ERR(q) == -ENOBUFS) | ||
| 308 | LIMIT_NETDEBUG(KERN_WARNING "%s%s", prefix, msg); | ||
| 309 | } | ||
| 310 | EXPORT_SYMBOL(inet_frag_maybe_warn_overflow); | ||
diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c index b6d30acb600c..a6445b843ef4 100644 --- a/net/ipv4/ip_fragment.c +++ b/net/ipv4/ip_fragment.c | |||
| @@ -292,14 +292,11 @@ static inline struct ipq *ip_find(struct net *net, struct iphdr *iph, u32 user) | |||
| 292 | hash = ipqhashfn(iph->id, iph->saddr, iph->daddr, iph->protocol); | 292 | hash = ipqhashfn(iph->id, iph->saddr, iph->daddr, iph->protocol); |
| 293 | 293 | ||
| 294 | q = inet_frag_find(&net->ipv4.frags, &ip4_frags, &arg, hash); | 294 | q = inet_frag_find(&net->ipv4.frags, &ip4_frags, &arg, hash); |
| 295 | if (q == NULL) | 295 | if (IS_ERR_OR_NULL(q)) { |
| 296 | goto out_nomem; | 296 | inet_frag_maybe_warn_overflow(q, pr_fmt()); |
| 297 | 297 | return NULL; | |
| 298 | } | ||
| 298 | return container_of(q, struct ipq, q); | 299 | return container_of(q, struct ipq, q); |
| 299 | |||
| 300 | out_nomem: | ||
| 301 | LIMIT_NETDEBUG(KERN_ERR pr_fmt("ip_frag_create: no memory left !\n")); | ||
| 302 | return NULL; | ||
| 303 | } | 300 | } |
| 304 | 301 | ||
| 305 | /* Is the fragment too far ahead to be part of ipq? */ | 302 | /* Is the fragment too far ahead to be part of ipq? */ |
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index d0ef0e674ec5..91d66dbde9c0 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c | |||
| @@ -798,10 +798,7 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev | |||
| 798 | 798 | ||
| 799 | if (dev->header_ops && dev->type == ARPHRD_IPGRE) { | 799 | if (dev->header_ops && dev->type == ARPHRD_IPGRE) { |
| 800 | gre_hlen = 0; | 800 | gre_hlen = 0; |
| 801 | if (skb->protocol == htons(ETH_P_IP)) | 801 | tiph = (const struct iphdr *)skb->data; |
| 802 | tiph = (const struct iphdr *)skb->data; | ||
| 803 | else | ||
| 804 | tiph = &tunnel->parms.iph; | ||
| 805 | } else { | 802 | } else { |
| 806 | gre_hlen = tunnel->hlen; | 803 | gre_hlen = tunnel->hlen; |
| 807 | tiph = &tunnel->parms.iph; | 804 | tiph = &tunnel->parms.iph; |
diff --git a/net/ipv4/ip_options.c b/net/ipv4/ip_options.c index 310a3647c83d..ec7264514a82 100644 --- a/net/ipv4/ip_options.c +++ b/net/ipv4/ip_options.c | |||
| @@ -370,7 +370,6 @@ int ip_options_compile(struct net *net, | |||
| 370 | } | 370 | } |
| 371 | switch (optptr[3]&0xF) { | 371 | switch (optptr[3]&0xF) { |
| 372 | case IPOPT_TS_TSONLY: | 372 | case IPOPT_TS_TSONLY: |
| 373 | opt->ts = optptr - iph; | ||
| 374 | if (skb) | 373 | if (skb) |
| 375 | timeptr = &optptr[optptr[2]-1]; | 374 | timeptr = &optptr[optptr[2]-1]; |
| 376 | opt->ts_needtime = 1; | 375 | opt->ts_needtime = 1; |
| @@ -381,7 +380,6 @@ int ip_options_compile(struct net *net, | |||
| 381 | pp_ptr = optptr + 2; | 380 | pp_ptr = optptr + 2; |
| 382 | goto error; | 381 | goto error; |
| 383 | } | 382 | } |
| 384 | opt->ts = optptr - iph; | ||
| 385 | if (rt) { | 383 | if (rt) { |
| 386 | spec_dst_fill(&spec_dst, skb); | 384 | spec_dst_fill(&spec_dst, skb); |
| 387 | memcpy(&optptr[optptr[2]-1], &spec_dst, 4); | 385 | memcpy(&optptr[optptr[2]-1], &spec_dst, 4); |
| @@ -396,7 +394,6 @@ int ip_options_compile(struct net *net, | |||
| 396 | pp_ptr = optptr + 2; | 394 | pp_ptr = optptr + 2; |
| 397 | goto error; | 395 | goto error; |
| 398 | } | 396 | } |
| 399 | opt->ts = optptr - iph; | ||
| 400 | { | 397 | { |
| 401 | __be32 addr; | 398 | __be32 addr; |
| 402 | memcpy(&addr, &optptr[optptr[2]-1], 4); | 399 | memcpy(&addr, &optptr[optptr[2]-1], 4); |
| @@ -429,12 +426,12 @@ int ip_options_compile(struct net *net, | |||
| 429 | pp_ptr = optptr + 3; | 426 | pp_ptr = optptr + 3; |
| 430 | goto error; | 427 | goto error; |
| 431 | } | 428 | } |
| 432 | opt->ts = optptr - iph; | ||
| 433 | if (skb) { | 429 | if (skb) { |
| 434 | optptr[3] = (optptr[3]&0xF)|((overflow+1)<<4); | 430 | optptr[3] = (optptr[3]&0xF)|((overflow+1)<<4); |
| 435 | opt->is_changed = 1; | 431 | opt->is_changed = 1; |
| 436 | } | 432 | } |
| 437 | } | 433 | } |
| 434 | opt->ts = optptr - iph; | ||
| 438 | break; | 435 | break; |
| 439 | case IPOPT_RA: | 436 | case IPOPT_RA: |
| 440 | if (optlen < 4) { | 437 | if (optlen < 4) { |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 47e854fcae24..e22020790709 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -775,7 +775,7 @@ struct sk_buff *sk_stream_alloc_skb(struct sock *sk, int size, gfp_t gfp) | |||
| 775 | * Make sure that we have exactly size bytes | 775 | * Make sure that we have exactly size bytes |
| 776 | * available to the caller, no more, no less. | 776 | * available to the caller, no more, no less. |
| 777 | */ | 777 | */ |
| 778 | skb->avail_size = size; | 778 | skb->reserved_tailroom = skb->end - skb->tail - size; |
| 779 | return skb; | 779 | return skb; |
| 780 | } | 780 | } |
| 781 | __kfree_skb(skb); | 781 | __kfree_skb(skb); |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 4a8ec457310f..d09203c63264 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
| @@ -274,13 +274,6 @@ static void tcp_v4_mtu_reduced(struct sock *sk) | |||
| 274 | struct inet_sock *inet = inet_sk(sk); | 274 | struct inet_sock *inet = inet_sk(sk); |
| 275 | u32 mtu = tcp_sk(sk)->mtu_info; | 275 | u32 mtu = tcp_sk(sk)->mtu_info; |
| 276 | 276 | ||
| 277 | /* We are not interested in TCP_LISTEN and open_requests (SYN-ACKs | ||
| 278 | * send out by Linux are always <576bytes so they should go through | ||
| 279 | * unfragmented). | ||
| 280 | */ | ||
| 281 | if (sk->sk_state == TCP_LISTEN) | ||
| 282 | return; | ||
| 283 | |||
| 284 | dst = inet_csk_update_pmtu(sk, mtu); | 277 | dst = inet_csk_update_pmtu(sk, mtu); |
| 285 | if (!dst) | 278 | if (!dst) |
| 286 | return; | 279 | return; |
| @@ -408,6 +401,13 @@ void tcp_v4_err(struct sk_buff *icmp_skb, u32 info) | |||
| 408 | goto out; | 401 | goto out; |
| 409 | 402 | ||
| 410 | if (code == ICMP_FRAG_NEEDED) { /* PMTU discovery (RFC1191) */ | 403 | if (code == ICMP_FRAG_NEEDED) { /* PMTU discovery (RFC1191) */ |
| 404 | /* We are not interested in TCP_LISTEN and open_requests | ||
| 405 | * (SYN-ACKs send out by Linux are always <576bytes so | ||
| 406 | * they should go through unfragmented). | ||
| 407 | */ | ||
| 408 | if (sk->sk_state == TCP_LISTEN) | ||
| 409 | goto out; | ||
| 410 | |||
| 411 | tp->mtu_info = info; | 411 | tp->mtu_info = info; |
| 412 | if (!sock_owned_by_user(sk)) { | 412 | if (!sock_owned_by_user(sk)) { |
| 413 | tcp_v4_mtu_reduced(sk); | 413 | tcp_v4_mtu_reduced(sk); |
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index e2b4461074da..817fbb396bc8 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
| @@ -1298,7 +1298,6 @@ static void __pskb_trim_head(struct sk_buff *skb, int len) | |||
| 1298 | eat = min_t(int, len, skb_headlen(skb)); | 1298 | eat = min_t(int, len, skb_headlen(skb)); |
| 1299 | if (eat) { | 1299 | if (eat) { |
| 1300 | __skb_pull(skb, eat); | 1300 | __skb_pull(skb, eat); |
| 1301 | skb->avail_size -= eat; | ||
| 1302 | len -= eat; | 1301 | len -= eat; |
| 1303 | if (!len) | 1302 | if (!len) |
| 1304 | return; | 1303 | return; |
diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c index 54087e96d7b8..6700069949dd 100644 --- a/net/ipv6/netfilter/nf_conntrack_reasm.c +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c | |||
| @@ -14,6 +14,8 @@ | |||
| 14 | * 2 of the License, or (at your option) any later version. | 14 | * 2 of the License, or (at your option) any later version. |
| 15 | */ | 15 | */ |
| 16 | 16 | ||
| 17 | #define pr_fmt(fmt) "IPv6-nf: " fmt | ||
| 18 | |||
| 17 | #include <linux/errno.h> | 19 | #include <linux/errno.h> |
| 18 | #include <linux/types.h> | 20 | #include <linux/types.h> |
| 19 | #include <linux/string.h> | 21 | #include <linux/string.h> |
| @@ -180,13 +182,11 @@ static inline struct frag_queue *fq_find(struct net *net, __be32 id, | |||
| 180 | 182 | ||
| 181 | q = inet_frag_find(&net->nf_frag.frags, &nf_frags, &arg, hash); | 183 | q = inet_frag_find(&net->nf_frag.frags, &nf_frags, &arg, hash); |
| 182 | local_bh_enable(); | 184 | local_bh_enable(); |
| 183 | if (q == NULL) | 185 | if (IS_ERR_OR_NULL(q)) { |
| 184 | goto oom; | 186 | inet_frag_maybe_warn_overflow(q, pr_fmt()); |
| 185 | 187 | return NULL; | |
| 188 | } | ||
| 186 | return container_of(q, struct frag_queue, q); | 189 | return container_of(q, struct frag_queue, q); |
| 187 | |||
| 188 | oom: | ||
| 189 | return NULL; | ||
| 190 | } | 190 | } |
| 191 | 191 | ||
| 192 | 192 | ||
diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c index 3c6a77290c6e..196ab9347ad1 100644 --- a/net/ipv6/reassembly.c +++ b/net/ipv6/reassembly.c | |||
| @@ -26,6 +26,9 @@ | |||
| 26 | * YOSHIFUJI,H. @USAGI Always remove fragment header to | 26 | * YOSHIFUJI,H. @USAGI Always remove fragment header to |
| 27 | * calculate ICV correctly. | 27 | * calculate ICV correctly. |
| 28 | */ | 28 | */ |
| 29 | |||
| 30 | #define pr_fmt(fmt) "IPv6: " fmt | ||
| 31 | |||
| 29 | #include <linux/errno.h> | 32 | #include <linux/errno.h> |
| 30 | #include <linux/types.h> | 33 | #include <linux/types.h> |
| 31 | #include <linux/string.h> | 34 | #include <linux/string.h> |
| @@ -185,9 +188,10 @@ fq_find(struct net *net, __be32 id, const struct in6_addr *src, const struct in6 | |||
| 185 | hash = inet6_hash_frag(id, src, dst, ip6_frags.rnd); | 188 | hash = inet6_hash_frag(id, src, dst, ip6_frags.rnd); |
| 186 | 189 | ||
| 187 | q = inet_frag_find(&net->ipv6.frags, &ip6_frags, &arg, hash); | 190 | q = inet_frag_find(&net->ipv6.frags, &ip6_frags, &arg, hash); |
| 188 | if (q == NULL) | 191 | if (IS_ERR_OR_NULL(q)) { |
| 192 | inet_frag_maybe_warn_overflow(q, pr_fmt()); | ||
| 189 | return NULL; | 193 | return NULL; |
| 190 | 194 | } | |
| 191 | return container_of(q, struct frag_queue, q); | 195 | return container_of(q, struct frag_queue, q); |
| 192 | } | 196 | } |
| 193 | 197 | ||
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 9b6460055df5..f6d629fd6aee 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
| @@ -389,6 +389,13 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
| 389 | } | 389 | } |
| 390 | 390 | ||
| 391 | if (type == ICMPV6_PKT_TOOBIG) { | 391 | if (type == ICMPV6_PKT_TOOBIG) { |
| 392 | /* We are not interested in TCP_LISTEN and open_requests | ||
| 393 | * (SYN-ACKs send out by Linux are always <576bytes so | ||
| 394 | * they should go through unfragmented). | ||
| 395 | */ | ||
| 396 | if (sk->sk_state == TCP_LISTEN) | ||
| 397 | goto out; | ||
| 398 | |||
| 392 | tp->mtu_info = ntohl(info); | 399 | tp->mtu_info = ntohl(info); |
| 393 | if (!sock_owned_by_user(sk)) | 400 | if (!sock_owned_by_user(sk)) |
| 394 | tcp_v6_mtu_reduced(sk); | 401 | tcp_v6_mtu_reduced(sk); |
diff --git a/net/nfc/llcp/llcp.c b/net/nfc/llcp/llcp.c index 7f8266dd14cb..b530afadd76c 100644 --- a/net/nfc/llcp/llcp.c +++ b/net/nfc/llcp/llcp.c | |||
| @@ -68,7 +68,8 @@ static void nfc_llcp_socket_purge(struct nfc_llcp_sock *sock) | |||
| 68 | } | 68 | } |
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | static void nfc_llcp_socket_release(struct nfc_llcp_local *local, bool listen) | 71 | static void nfc_llcp_socket_release(struct nfc_llcp_local *local, bool listen, |
| 72 | int err) | ||
| 72 | { | 73 | { |
| 73 | struct sock *sk; | 74 | struct sock *sk; |
| 74 | struct hlist_node *tmp; | 75 | struct hlist_node *tmp; |
| @@ -100,7 +101,10 @@ static void nfc_llcp_socket_release(struct nfc_llcp_local *local, bool listen) | |||
| 100 | 101 | ||
| 101 | nfc_llcp_accept_unlink(accept_sk); | 102 | nfc_llcp_accept_unlink(accept_sk); |
| 102 | 103 | ||
| 104 | if (err) | ||
| 105 | accept_sk->sk_err = err; | ||
| 103 | accept_sk->sk_state = LLCP_CLOSED; | 106 | accept_sk->sk_state = LLCP_CLOSED; |
| 107 | accept_sk->sk_state_change(sk); | ||
| 104 | 108 | ||
| 105 | bh_unlock_sock(accept_sk); | 109 | bh_unlock_sock(accept_sk); |
| 106 | 110 | ||
| @@ -123,7 +127,10 @@ static void nfc_llcp_socket_release(struct nfc_llcp_local *local, bool listen) | |||
| 123 | continue; | 127 | continue; |
| 124 | } | 128 | } |
| 125 | 129 | ||
| 130 | if (err) | ||
| 131 | sk->sk_err = err; | ||
| 126 | sk->sk_state = LLCP_CLOSED; | 132 | sk->sk_state = LLCP_CLOSED; |
| 133 | sk->sk_state_change(sk); | ||
| 127 | 134 | ||
| 128 | bh_unlock_sock(sk); | 135 | bh_unlock_sock(sk); |
| 129 | 136 | ||
| @@ -133,6 +140,36 @@ static void nfc_llcp_socket_release(struct nfc_llcp_local *local, bool listen) | |||
| 133 | } | 140 | } |
| 134 | 141 | ||
| 135 | write_unlock(&local->sockets.lock); | 142 | write_unlock(&local->sockets.lock); |
| 143 | |||
| 144 | /* | ||
| 145 | * If we want to keep the listening sockets alive, | ||
| 146 | * we don't touch the RAW ones. | ||
| 147 | */ | ||
| 148 | if (listen == true) | ||
| 149 | return; | ||
| 150 | |||
| 151 | write_lock(&local->raw_sockets.lock); | ||
| 152 | |||
| 153 | sk_for_each_safe(sk, tmp, &local->raw_sockets.head) { | ||
| 154 | llcp_sock = nfc_llcp_sock(sk); | ||
| 155 | |||
| 156 | bh_lock_sock(sk); | ||
| 157 | |||
| 158 | nfc_llcp_socket_purge(llcp_sock); | ||
| 159 | |||
| 160 | if (err) | ||
| 161 | sk->sk_err = err; | ||
| 162 | sk->sk_state = LLCP_CLOSED; | ||
| 163 | sk->sk_state_change(sk); | ||
| 164 | |||
| 165 | bh_unlock_sock(sk); | ||
| 166 | |||
| 167 | sock_orphan(sk); | ||
| 168 | |||
| 169 | sk_del_node_init(sk); | ||
| 170 | } | ||
| 171 | |||
| 172 | write_unlock(&local->raw_sockets.lock); | ||
| 136 | } | 173 | } |
| 137 | 174 | ||
| 138 | struct nfc_llcp_local *nfc_llcp_local_get(struct nfc_llcp_local *local) | 175 | struct nfc_llcp_local *nfc_llcp_local_get(struct nfc_llcp_local *local) |
| @@ -142,20 +179,25 @@ struct nfc_llcp_local *nfc_llcp_local_get(struct nfc_llcp_local *local) | |||
| 142 | return local; | 179 | return local; |
| 143 | } | 180 | } |
| 144 | 181 | ||
| 145 | static void local_release(struct kref *ref) | 182 | static void local_cleanup(struct nfc_llcp_local *local, bool listen) |
| 146 | { | 183 | { |
| 147 | struct nfc_llcp_local *local; | 184 | nfc_llcp_socket_release(local, listen, ENXIO); |
| 148 | |||
| 149 | local = container_of(ref, struct nfc_llcp_local, ref); | ||
| 150 | |||
| 151 | list_del(&local->list); | ||
| 152 | nfc_llcp_socket_release(local, false); | ||
| 153 | del_timer_sync(&local->link_timer); | 185 | del_timer_sync(&local->link_timer); |
| 154 | skb_queue_purge(&local->tx_queue); | 186 | skb_queue_purge(&local->tx_queue); |
| 155 | cancel_work_sync(&local->tx_work); | 187 | cancel_work_sync(&local->tx_work); |
| 156 | cancel_work_sync(&local->rx_work); | 188 | cancel_work_sync(&local->rx_work); |
| 157 | cancel_work_sync(&local->timeout_work); | 189 | cancel_work_sync(&local->timeout_work); |
| 158 | kfree_skb(local->rx_pending); | 190 | kfree_skb(local->rx_pending); |
| 191 | } | ||
| 192 | |||
| 193 | static void local_release(struct kref *ref) | ||
| 194 | { | ||
| 195 | struct nfc_llcp_local *local; | ||
| 196 | |||
| 197 | local = container_of(ref, struct nfc_llcp_local, ref); | ||
| 198 | |||
| 199 | list_del(&local->list); | ||
| 200 | local_cleanup(local, false); | ||
| 159 | kfree(local); | 201 | kfree(local); |
| 160 | } | 202 | } |
| 161 | 203 | ||
| @@ -1348,7 +1390,7 @@ void nfc_llcp_mac_is_down(struct nfc_dev *dev) | |||
| 1348 | return; | 1390 | return; |
| 1349 | 1391 | ||
| 1350 | /* Close and purge all existing sockets */ | 1392 | /* Close and purge all existing sockets */ |
| 1351 | nfc_llcp_socket_release(local, true); | 1393 | nfc_llcp_socket_release(local, true, 0); |
| 1352 | } | 1394 | } |
| 1353 | 1395 | ||
| 1354 | void nfc_llcp_mac_is_up(struct nfc_dev *dev, u32 target_idx, | 1396 | void nfc_llcp_mac_is_up(struct nfc_dev *dev, u32 target_idx, |
| @@ -1427,6 +1469,8 @@ void nfc_llcp_unregister_device(struct nfc_dev *dev) | |||
| 1427 | return; | 1469 | return; |
| 1428 | } | 1470 | } |
| 1429 | 1471 | ||
| 1472 | local_cleanup(local, false); | ||
| 1473 | |||
| 1430 | nfc_llcp_local_put(local); | 1474 | nfc_llcp_local_put(local); |
| 1431 | } | 1475 | } |
| 1432 | 1476 | ||
diff --git a/net/nfc/llcp/sock.c b/net/nfc/llcp/sock.c index 5332751943a9..5c7cdf3f2a83 100644 --- a/net/nfc/llcp/sock.c +++ b/net/nfc/llcp/sock.c | |||
| @@ -278,6 +278,8 @@ struct sock *nfc_llcp_accept_dequeue(struct sock *parent, | |||
| 278 | 278 | ||
| 279 | pr_debug("Returning sk state %d\n", sk->sk_state); | 279 | pr_debug("Returning sk state %d\n", sk->sk_state); |
| 280 | 280 | ||
| 281 | sk_acceptq_removed(parent); | ||
| 282 | |||
| 281 | return sk; | 283 | return sk; |
| 282 | } | 284 | } |
| 283 | 285 | ||
diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c index ac2defeeba83..d4d5363c7ba7 100644 --- a/net/openvswitch/actions.c +++ b/net/openvswitch/actions.c | |||
| @@ -58,7 +58,7 @@ static int __pop_vlan_tci(struct sk_buff *skb, __be16 *current_tci) | |||
| 58 | 58 | ||
| 59 | if (skb->ip_summed == CHECKSUM_COMPLETE) | 59 | if (skb->ip_summed == CHECKSUM_COMPLETE) |
| 60 | skb->csum = csum_sub(skb->csum, csum_partial(skb->data | 60 | skb->csum = csum_sub(skb->csum, csum_partial(skb->data |
| 61 | + ETH_HLEN, VLAN_HLEN, 0)); | 61 | + (2 * ETH_ALEN), VLAN_HLEN, 0)); |
| 62 | 62 | ||
| 63 | vhdr = (struct vlan_hdr *)(skb->data + ETH_HLEN); | 63 | vhdr = (struct vlan_hdr *)(skb->data + ETH_HLEN); |
| 64 | *current_tci = vhdr->h_vlan_TCI; | 64 | *current_tci = vhdr->h_vlan_TCI; |
| @@ -115,7 +115,7 @@ static int push_vlan(struct sk_buff *skb, const struct ovs_action_push_vlan *vla | |||
| 115 | 115 | ||
| 116 | if (skb->ip_summed == CHECKSUM_COMPLETE) | 116 | if (skb->ip_summed == CHECKSUM_COMPLETE) |
| 117 | skb->csum = csum_add(skb->csum, csum_partial(skb->data | 117 | skb->csum = csum_add(skb->csum, csum_partial(skb->data |
| 118 | + ETH_HLEN, VLAN_HLEN, 0)); | 118 | + (2 * ETH_ALEN), VLAN_HLEN, 0)); |
| 119 | 119 | ||
| 120 | } | 120 | } |
| 121 | __vlan_hwaccel_put_tag(skb, ntohs(vlan->vlan_tci) & ~VLAN_TAG_PRESENT); | 121 | __vlan_hwaccel_put_tag(skb, ntohs(vlan->vlan_tci) & ~VLAN_TAG_PRESENT); |
diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index e87a26506dba..a4b724708a1a 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c | |||
| @@ -394,6 +394,7 @@ static int queue_userspace_packet(struct net *net, int dp_ifindex, | |||
| 394 | 394 | ||
| 395 | skb_copy_and_csum_dev(skb, nla_data(nla)); | 395 | skb_copy_and_csum_dev(skb, nla_data(nla)); |
| 396 | 396 | ||
| 397 | genlmsg_end(user_skb, upcall); | ||
| 397 | err = genlmsg_unicast(net, user_skb, upcall_info->portid); | 398 | err = genlmsg_unicast(net, user_skb, upcall_info->portid); |
| 398 | 399 | ||
| 399 | out: | 400 | out: |
| @@ -1690,6 +1691,7 @@ static int ovs_vport_cmd_new(struct sk_buff *skb, struct genl_info *info) | |||
| 1690 | if (IS_ERR(vport)) | 1691 | if (IS_ERR(vport)) |
| 1691 | goto exit_unlock; | 1692 | goto exit_unlock; |
| 1692 | 1693 | ||
| 1694 | err = 0; | ||
| 1693 | reply = ovs_vport_cmd_build_info(vport, info->snd_portid, info->snd_seq, | 1695 | reply = ovs_vport_cmd_build_info(vport, info->snd_portid, info->snd_seq, |
| 1694 | OVS_VPORT_CMD_NEW); | 1696 | OVS_VPORT_CMD_NEW); |
| 1695 | if (IS_ERR(reply)) { | 1697 | if (IS_ERR(reply)) { |
| @@ -1771,6 +1773,7 @@ static int ovs_vport_cmd_del(struct sk_buff *skb, struct genl_info *info) | |||
| 1771 | if (IS_ERR(reply)) | 1773 | if (IS_ERR(reply)) |
| 1772 | goto exit_unlock; | 1774 | goto exit_unlock; |
| 1773 | 1775 | ||
| 1776 | err = 0; | ||
| 1774 | ovs_dp_detach_port(vport); | 1777 | ovs_dp_detach_port(vport); |
| 1775 | 1778 | ||
| 1776 | genl_notify(reply, genl_info_net(info), info->snd_portid, | 1779 | genl_notify(reply, genl_info_net(info), info->snd_portid, |
diff --git a/net/openvswitch/flow.c b/net/openvswitch/flow.c index 20605ecf100b..fe0e4215c73d 100644 --- a/net/openvswitch/flow.c +++ b/net/openvswitch/flow.c | |||
| @@ -482,7 +482,11 @@ static __be16 parse_ethertype(struct sk_buff *skb) | |||
| 482 | return htons(ETH_P_802_2); | 482 | return htons(ETH_P_802_2); |
| 483 | 483 | ||
| 484 | __skb_pull(skb, sizeof(struct llc_snap_hdr)); | 484 | __skb_pull(skb, sizeof(struct llc_snap_hdr)); |
| 485 | return llc->ethertype; | 485 | |
| 486 | if (ntohs(llc->ethertype) >= 1536) | ||
| 487 | return llc->ethertype; | ||
| 488 | |||
| 489 | return htons(ETH_P_802_2); | ||
| 486 | } | 490 | } |
| 487 | 491 | ||
| 488 | static int parse_icmpv6(struct sk_buff *skb, struct sw_flow_key *key, | 492 | static int parse_icmpv6(struct sk_buff *skb, struct sw_flow_key *key, |
diff --git a/net/openvswitch/vport-netdev.c b/net/openvswitch/vport-netdev.c index 670cbc3518de..2130d61c384a 100644 --- a/net/openvswitch/vport-netdev.c +++ b/net/openvswitch/vport-netdev.c | |||
| @@ -43,8 +43,7 @@ static void netdev_port_receive(struct vport *vport, struct sk_buff *skb) | |||
| 43 | 43 | ||
| 44 | /* Make our own copy of the packet. Otherwise we will mangle the | 44 | /* Make our own copy of the packet. Otherwise we will mangle the |
| 45 | * packet for anyone who came before us (e.g. tcpdump via AF_PACKET). | 45 | * packet for anyone who came before us (e.g. tcpdump via AF_PACKET). |
| 46 | * (No one comes after us, since we tell handle_bridge() that we took | 46 | */ |
| 47 | * the packet.) */ | ||
| 48 | skb = skb_share_check(skb, GFP_ATOMIC); | 47 | skb = skb_share_check(skb, GFP_ATOMIC); |
| 49 | if (unlikely(!skb)) | 48 | if (unlikely(!skb)) |
| 50 | return; | 49 | return; |
diff --git a/net/openvswitch/vport.c b/net/openvswitch/vport.c index ba717cc038b3..f6b8132ce4cb 100644 --- a/net/openvswitch/vport.c +++ b/net/openvswitch/vport.c | |||
| @@ -325,8 +325,7 @@ int ovs_vport_get_options(const struct vport *vport, struct sk_buff *skb) | |||
| 325 | * @skb: skb that was received | 325 | * @skb: skb that was received |
| 326 | * | 326 | * |
| 327 | * Must be called with rcu_read_lock. The packet cannot be shared and | 327 | * Must be called with rcu_read_lock. The packet cannot be shared and |
| 328 | * skb->data should point to the Ethernet header. The caller must have already | 328 | * skb->data should point to the Ethernet header. |
| 329 | * called compute_ip_summed() to initialize the checksumming fields. | ||
| 330 | */ | 329 | */ |
| 331 | void ovs_vport_receive(struct vport *vport, struct sk_buff *skb) | 330 | void ovs_vport_receive(struct vport *vport, struct sk_buff *skb) |
| 332 | { | 331 | { |
diff --git a/net/sctp/associola.c b/net/sctp/associola.c index 43cd0dd9149d..d2709e2b7be6 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c | |||
| @@ -1079,7 +1079,7 @@ struct sctp_transport *sctp_assoc_lookup_tsn(struct sctp_association *asoc, | |||
| 1079 | transports) { | 1079 | transports) { |
| 1080 | 1080 | ||
| 1081 | if (transport == active) | 1081 | if (transport == active) |
| 1082 | break; | 1082 | continue; |
| 1083 | list_for_each_entry(chunk, &transport->transmitted, | 1083 | list_for_each_entry(chunk, &transport->transmitted, |
| 1084 | transmitted_list) { | 1084 | transmitted_list) { |
| 1085 | if (key == chunk->subh.data_hdr->tsn) { | 1085 | if (key == chunk->subh.data_hdr->tsn) { |
diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c index 5131fcfedb03..de1a0138317f 100644 --- a/net/sctp/sm_statefuns.c +++ b/net/sctp/sm_statefuns.c | |||
| @@ -2082,7 +2082,7 @@ sctp_disposition_t sctp_sf_do_5_2_4_dupcook(struct net *net, | |||
| 2082 | } | 2082 | } |
| 2083 | 2083 | ||
| 2084 | /* Delete the tempory new association. */ | 2084 | /* Delete the tempory new association. */ |
| 2085 | sctp_add_cmd_sf(commands, SCTP_CMD_NEW_ASOC, SCTP_ASOC(new_asoc)); | 2085 | sctp_add_cmd_sf(commands, SCTP_CMD_SET_ASOC, SCTP_ASOC(new_asoc)); |
| 2086 | sctp_add_cmd_sf(commands, SCTP_CMD_DELETE_TCB, SCTP_NULL()); | 2086 | sctp_add_cmd_sf(commands, SCTP_CMD_DELETE_TCB, SCTP_NULL()); |
| 2087 | 2087 | ||
| 2088 | /* Restore association pointer to provide SCTP command interpeter | 2088 | /* Restore association pointer to provide SCTP command interpeter |
