diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/bridge/br_netfilter.c | 32 | ||||
| -rw-r--r-- | net/bridge/netfilter/ebtables.c | 16 | ||||
| -rw-r--r-- | net/ipv4/tcp_input.c | 4 | ||||
| -rw-r--r-- | net/ipv6/addrconf.c | 4 | ||||
| -rw-r--r-- | net/netfilter/nf_conntrack_core.c | 8 | ||||
| -rw-r--r-- | net/netfilter/nf_conntrack_netlink.c | 3 |
6 files changed, 45 insertions, 22 deletions
diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c index 84122472656c..dec4f3817133 100644 --- a/net/bridge/br_netfilter.c +++ b/net/bridge/br_netfilter.c | |||
| @@ -62,6 +62,15 @@ static int brnf_filter_pppoe_tagged __read_mostly = 0; | |||
| 62 | #define brnf_filter_pppoe_tagged 0 | 62 | #define brnf_filter_pppoe_tagged 0 |
| 63 | #endif | 63 | #endif |
| 64 | 64 | ||
| 65 | #define IS_IP(skb) \ | ||
| 66 | (!vlan_tx_tag_present(skb) && skb->protocol == htons(ETH_P_IP)) | ||
| 67 | |||
| 68 | #define IS_IPV6(skb) \ | ||
| 69 | (!vlan_tx_tag_present(skb) && skb->protocol == htons(ETH_P_IPV6)) | ||
| 70 | |||
| 71 | #define IS_ARP(skb) \ | ||
| 72 | (!vlan_tx_tag_present(skb) && skb->protocol == htons(ETH_P_ARP)) | ||
| 73 | |||
| 65 | static inline __be16 vlan_proto(const struct sk_buff *skb) | 74 | static inline __be16 vlan_proto(const struct sk_buff *skb) |
| 66 | { | 75 | { |
| 67 | if (vlan_tx_tag_present(skb)) | 76 | if (vlan_tx_tag_present(skb)) |
| @@ -639,8 +648,7 @@ static unsigned int br_nf_pre_routing(unsigned int hook, struct sk_buff *skb, | |||
| 639 | return NF_DROP; | 648 | return NF_DROP; |
| 640 | br = p->br; | 649 | br = p->br; |
| 641 | 650 | ||
| 642 | if (skb->protocol == htons(ETH_P_IPV6) || IS_VLAN_IPV6(skb) || | 651 | if (IS_IPV6(skb) || IS_VLAN_IPV6(skb) || IS_PPPOE_IPV6(skb)) { |
| 643 | IS_PPPOE_IPV6(skb)) { | ||
| 644 | if (!brnf_call_ip6tables && !br->nf_call_ip6tables) | 652 | if (!brnf_call_ip6tables && !br->nf_call_ip6tables) |
| 645 | return NF_ACCEPT; | 653 | return NF_ACCEPT; |
| 646 | 654 | ||
| @@ -651,8 +659,7 @@ static unsigned int br_nf_pre_routing(unsigned int hook, struct sk_buff *skb, | |||
| 651 | if (!brnf_call_iptables && !br->nf_call_iptables) | 659 | if (!brnf_call_iptables && !br->nf_call_iptables) |
| 652 | return NF_ACCEPT; | 660 | return NF_ACCEPT; |
| 653 | 661 | ||
| 654 | if (skb->protocol != htons(ETH_P_IP) && !IS_VLAN_IP(skb) && | 662 | if (!IS_IP(skb) && !IS_VLAN_IP(skb) && !IS_PPPOE_IP(skb)) |
| 655 | !IS_PPPOE_IP(skb)) | ||
| 656 | return NF_ACCEPT; | 663 | return NF_ACCEPT; |
| 657 | 664 | ||
| 658 | nf_bridge_pull_encap_header_rcsum(skb); | 665 | nf_bridge_pull_encap_header_rcsum(skb); |
| @@ -701,7 +708,7 @@ static int br_nf_forward_finish(struct sk_buff *skb) | |||
| 701 | struct nf_bridge_info *nf_bridge = skb->nf_bridge; | 708 | struct nf_bridge_info *nf_bridge = skb->nf_bridge; |
| 702 | struct net_device *in; | 709 | struct net_device *in; |
| 703 | 710 | ||
| 704 | if (skb->protocol != htons(ETH_P_ARP) && !IS_VLAN_ARP(skb)) { | 711 | if (!IS_ARP(skb) && !IS_VLAN_ARP(skb)) { |
| 705 | in = nf_bridge->physindev; | 712 | in = nf_bridge->physindev; |
| 706 | if (nf_bridge->mask & BRNF_PKT_TYPE) { | 713 | if (nf_bridge->mask & BRNF_PKT_TYPE) { |
| 707 | skb->pkt_type = PACKET_OTHERHOST; | 714 | skb->pkt_type = PACKET_OTHERHOST; |
| @@ -718,6 +725,7 @@ static int br_nf_forward_finish(struct sk_buff *skb) | |||
| 718 | return 0; | 725 | return 0; |
| 719 | } | 726 | } |
| 720 | 727 | ||
| 728 | |||
| 721 | /* This is the 'purely bridged' case. For IP, we pass the packet to | 729 | /* This is the 'purely bridged' case. For IP, we pass the packet to |
| 722 | * netfilter with indev and outdev set to the bridge device, | 730 | * netfilter with indev and outdev set to the bridge device, |
| 723 | * but we are still able to filter on the 'real' indev/outdev | 731 | * but we are still able to filter on the 'real' indev/outdev |
| @@ -744,11 +752,9 @@ static unsigned int br_nf_forward_ip(unsigned int hook, struct sk_buff *skb, | |||
| 744 | if (!parent) | 752 | if (!parent) |
| 745 | return NF_DROP; | 753 | return NF_DROP; |
| 746 | 754 | ||
| 747 | if (skb->protocol == htons(ETH_P_IP) || IS_VLAN_IP(skb) || | 755 | if (IS_IP(skb) || IS_VLAN_IP(skb) || IS_PPPOE_IP(skb)) |
| 748 | IS_PPPOE_IP(skb)) | ||
| 749 | pf = PF_INET; | 756 | pf = PF_INET; |
| 750 | else if (skb->protocol == htons(ETH_P_IPV6) || IS_VLAN_IPV6(skb) || | 757 | else if (IS_IPV6(skb) || IS_VLAN_IPV6(skb) || IS_PPPOE_IPV6(skb)) |
| 751 | IS_PPPOE_IPV6(skb)) | ||
| 752 | pf = PF_INET6; | 758 | pf = PF_INET6; |
| 753 | else | 759 | else |
| 754 | return NF_ACCEPT; | 760 | return NF_ACCEPT; |
| @@ -795,7 +801,7 @@ static unsigned int br_nf_forward_arp(unsigned int hook, struct sk_buff *skb, | |||
| 795 | if (!brnf_call_arptables && !br->nf_call_arptables) | 801 | if (!brnf_call_arptables && !br->nf_call_arptables) |
| 796 | return NF_ACCEPT; | 802 | return NF_ACCEPT; |
| 797 | 803 | ||
| 798 | if (skb->protocol != htons(ETH_P_ARP)) { | 804 | if (!IS_ARP(skb)) { |
| 799 | if (!IS_VLAN_ARP(skb)) | 805 | if (!IS_VLAN_ARP(skb)) |
| 800 | return NF_ACCEPT; | 806 | return NF_ACCEPT; |
| 801 | nf_bridge_pull_encap_header(skb); | 807 | nf_bridge_pull_encap_header(skb); |
| @@ -853,11 +859,9 @@ static unsigned int br_nf_post_routing(unsigned int hook, struct sk_buff *skb, | |||
| 853 | if (!realoutdev) | 859 | if (!realoutdev) |
| 854 | return NF_DROP; | 860 | return NF_DROP; |
| 855 | 861 | ||
| 856 | if (skb->protocol == htons(ETH_P_IP) || IS_VLAN_IP(skb) || | 862 | if (IS_IP(skb) || IS_VLAN_IP(skb) || IS_PPPOE_IP(skb)) |
| 857 | IS_PPPOE_IP(skb)) | ||
| 858 | pf = PF_INET; | 863 | pf = PF_INET; |
| 859 | else if (skb->protocol == htons(ETH_P_IPV6) || IS_VLAN_IPV6(skb) || | 864 | else if (IS_IPV6(skb) || IS_VLAN_IPV6(skb) || IS_PPPOE_IPV6(skb)) |
| 860 | IS_PPPOE_IPV6(skb)) | ||
| 861 | pf = PF_INET6; | 865 | pf = PF_INET6; |
| 862 | else | 866 | else |
| 863 | return NF_ACCEPT; | 867 | return NF_ACCEPT; |
diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c index 8aa4ad0e06af..5fe2ff3b01ef 100644 --- a/net/bridge/netfilter/ebtables.c +++ b/net/bridge/netfilter/ebtables.c | |||
| @@ -1335,7 +1335,12 @@ static inline int ebt_make_matchname(const struct ebt_entry_match *m, | |||
| 1335 | const char *base, char __user *ubase) | 1335 | const char *base, char __user *ubase) |
| 1336 | { | 1336 | { |
| 1337 | char __user *hlp = ubase + ((char *)m - base); | 1337 | char __user *hlp = ubase + ((char *)m - base); |
| 1338 | if (copy_to_user(hlp, m->u.match->name, EBT_FUNCTION_MAXNAMELEN)) | 1338 | char name[EBT_FUNCTION_MAXNAMELEN] = {}; |
| 1339 | |||
| 1340 | /* ebtables expects 32 bytes long names but xt_match names are 29 bytes | ||
| 1341 | long. Copy 29 bytes and fill remaining bytes with zeroes. */ | ||
| 1342 | strncpy(name, m->u.match->name, sizeof(name)); | ||
| 1343 | if (copy_to_user(hlp, name, EBT_FUNCTION_MAXNAMELEN)) | ||
| 1339 | return -EFAULT; | 1344 | return -EFAULT; |
| 1340 | return 0; | 1345 | return 0; |
| 1341 | } | 1346 | } |
| @@ -1344,7 +1349,10 @@ static inline int ebt_make_watchername(const struct ebt_entry_watcher *w, | |||
| 1344 | const char *base, char __user *ubase) | 1349 | const char *base, char __user *ubase) |
| 1345 | { | 1350 | { |
| 1346 | char __user *hlp = ubase + ((char *)w - base); | 1351 | char __user *hlp = ubase + ((char *)w - base); |
| 1347 | if (copy_to_user(hlp , w->u.watcher->name, EBT_FUNCTION_MAXNAMELEN)) | 1352 | char name[EBT_FUNCTION_MAXNAMELEN] = {}; |
| 1353 | |||
| 1354 | strncpy(name, w->u.watcher->name, sizeof(name)); | ||
| 1355 | if (copy_to_user(hlp , name, EBT_FUNCTION_MAXNAMELEN)) | ||
| 1348 | return -EFAULT; | 1356 | return -EFAULT; |
| 1349 | return 0; | 1357 | return 0; |
| 1350 | } | 1358 | } |
| @@ -1355,6 +1363,7 @@ ebt_make_names(struct ebt_entry *e, const char *base, char __user *ubase) | |||
| 1355 | int ret; | 1363 | int ret; |
| 1356 | char __user *hlp; | 1364 | char __user *hlp; |
| 1357 | const struct ebt_entry_target *t; | 1365 | const struct ebt_entry_target *t; |
| 1366 | char name[EBT_FUNCTION_MAXNAMELEN] = {}; | ||
| 1358 | 1367 | ||
| 1359 | if (e->bitmask == 0) | 1368 | if (e->bitmask == 0) |
| 1360 | return 0; | 1369 | return 0; |
| @@ -1368,7 +1377,8 @@ ebt_make_names(struct ebt_entry *e, const char *base, char __user *ubase) | |||
| 1368 | ret = EBT_WATCHER_ITERATE(e, ebt_make_watchername, base, ubase); | 1377 | ret = EBT_WATCHER_ITERATE(e, ebt_make_watchername, base, ubase); |
| 1369 | if (ret != 0) | 1378 | if (ret != 0) |
| 1370 | return ret; | 1379 | return ret; |
| 1371 | if (copy_to_user(hlp, t->u.target->name, EBT_FUNCTION_MAXNAMELEN)) | 1380 | strncpy(name, t->u.target->name, sizeof(name)); |
| 1381 | if (copy_to_user(hlp, name, EBT_FUNCTION_MAXNAMELEN)) | ||
| 1372 | return -EFAULT; | 1382 | return -EFAULT; |
| 1373 | return 0; | 1383 | return 0; |
| 1374 | } | 1384 | } |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index d9b83d198c3d..b5e315f13641 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
| @@ -1585,6 +1585,10 @@ static struct sk_buff *tcp_shift_skb_data(struct sock *sk, struct sk_buff *skb, | |||
| 1585 | } | 1585 | } |
| 1586 | } | 1586 | } |
| 1587 | 1587 | ||
| 1588 | /* tcp_sacktag_one() won't SACK-tag ranges below snd_una */ | ||
| 1589 | if (!after(TCP_SKB_CB(skb)->seq + len, tp->snd_una)) | ||
| 1590 | goto fallback; | ||
| 1591 | |||
| 1588 | if (!skb_shift(prev, skb, len)) | 1592 | if (!skb_shift(prev, skb, len)) |
| 1589 | goto fallback; | 1593 | goto fallback; |
| 1590 | if (!tcp_shifted_skb(sk, skb, state, pcount, len, mss, dup_sack)) | 1594 | if (!tcp_shifted_skb(sk, skb, state, pcount, len, mss, dup_sack)) |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index c02280a4d126..6b8ebc5da0e1 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
| @@ -434,6 +434,10 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev) | |||
| 434 | /* Join all-node multicast group */ | 434 | /* Join all-node multicast group */ |
| 435 | ipv6_dev_mc_inc(dev, &in6addr_linklocal_allnodes); | 435 | ipv6_dev_mc_inc(dev, &in6addr_linklocal_allnodes); |
| 436 | 436 | ||
| 437 | /* Join all-router multicast group if forwarding is set */ | ||
| 438 | if (ndev->cnf.forwarding && dev && (dev->flags & IFF_MULTICAST)) | ||
| 439 | ipv6_dev_mc_inc(dev, &in6addr_linklocal_allrouters); | ||
| 440 | |||
| 437 | return ndev; | 441 | return ndev; |
| 438 | } | 442 | } |
| 439 | 443 | ||
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index ed86a3be678e..fa4b82c8ae80 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c | |||
| @@ -635,8 +635,12 @@ static noinline int early_drop(struct net *net, unsigned int hash) | |||
| 635 | 635 | ||
| 636 | if (del_timer(&ct->timeout)) { | 636 | if (del_timer(&ct->timeout)) { |
| 637 | death_by_timeout((unsigned long)ct); | 637 | death_by_timeout((unsigned long)ct); |
| 638 | dropped = 1; | 638 | /* Check if we indeed killed this entry. Reliable event |
| 639 | NF_CT_STAT_INC_ATOMIC(net, early_drop); | 639 | delivery may have inserted it into the dying list. */ |
| 640 | if (test_bit(IPS_DYING_BIT, &ct->status)) { | ||
| 641 | dropped = 1; | ||
| 642 | NF_CT_STAT_INC_ATOMIC(net, early_drop); | ||
| 643 | } | ||
| 640 | } | 644 | } |
| 641 | nf_ct_put(ct); | 645 | nf_ct_put(ct); |
| 642 | return dropped; | 646 | return dropped; |
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index 30c9d4ca0218..10687692831e 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c | |||
| @@ -1041,16 +1041,13 @@ ctnetlink_parse_nat_setup(struct nf_conn *ct, | |||
| 1041 | if (!parse_nat_setup) { | 1041 | if (!parse_nat_setup) { |
| 1042 | #ifdef CONFIG_MODULES | 1042 | #ifdef CONFIG_MODULES |
| 1043 | rcu_read_unlock(); | 1043 | rcu_read_unlock(); |
| 1044 | spin_unlock_bh(&nf_conntrack_lock); | ||
| 1045 | nfnl_unlock(); | 1044 | nfnl_unlock(); |
| 1046 | if (request_module("nf-nat-ipv4") < 0) { | 1045 | if (request_module("nf-nat-ipv4") < 0) { |
| 1047 | nfnl_lock(); | 1046 | nfnl_lock(); |
| 1048 | spin_lock_bh(&nf_conntrack_lock); | ||
| 1049 | rcu_read_lock(); | 1047 | rcu_read_lock(); |
| 1050 | return -EOPNOTSUPP; | 1048 | return -EOPNOTSUPP; |
| 1051 | } | 1049 | } |
| 1052 | nfnl_lock(); | 1050 | nfnl_lock(); |
| 1053 | spin_lock_bh(&nf_conntrack_lock); | ||
| 1054 | rcu_read_lock(); | 1051 | rcu_read_lock(); |
| 1055 | if (nfnetlink_parse_nat_setup_hook) | 1052 | if (nfnetlink_parse_nat_setup_hook) |
| 1056 | return -EAGAIN; | 1053 | return -EAGAIN; |
