diff options
| author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-08-27 18:06:01 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-08-27 18:06:01 -0400 |
| commit | 28d9aa613daa65b295a099a8433df97de1c56a2f (patch) | |
| tree | 8e7bf451f3390b926787d410c8d5df0454cbf16b /net | |
| parent | d243769d3f83b318813a04a9592bb7cfedc6c280 (diff) | |
| parent | 10e2ff1c39e6d829379c7c5bb8f1c8f512f257c8 (diff) | |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
* 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6:
[NET]: Mark Paul Moore as maintainer of labelled networking.
[VLAN/BRIDGE]: Fix "skb_pull_rcsum - Fatal exception in interrupt"
[ISDN]: Get rid of some pointless allocation casts in common and bsd comp.
[NET]: Avoid pointless allocation casts in BSD compression module
[IRDA]: Do not do pointless kmalloc return value cast in KingSun driver
[NET]: Fix crash in dev_mc_sync()/dev_mc_unsync()
[PPPOL2TP]: Fix endianness annotations.
[IOAT]: ioatdma needs to to play nice in a multi-dma-client world
[SLIP]: trivial sparse warning fix
[EQL]: sparse warning fix
[NET]: is_power_of_2 in net/core/neighbour.c
[TCP]: Describe tcp_init_cwnd() thoroughly in a comment.
[NET]: Fix IP_ADD/DROP_MEMBERSHIP to handle only connectionless
[KBUILD]: Sanitize tc_ematch headers.
[IPSEC] AH4: Update IPv4 options handling to conform to RFC 4302.
Diffstat (limited to 'net')
| -rw-r--r-- | net/8021q/vlan_dev.c | 12 | ||||
| -rw-r--r-- | net/bridge/br_netfilter.c | 12 | ||||
| -rw-r--r-- | net/core/dev_mcast.c | 14 | ||||
| -rw-r--r-- | net/core/neighbour.c | 3 | ||||
| -rw-r--r-- | net/ipv4/ah4.c | 2 | ||||
| -rw-r--r-- | net/ipv4/ip_sockglue.c | 4 | ||||
| -rw-r--r-- | net/ipv4/tcp_input.c | 10 | ||||
| -rw-r--r-- | net/ipv6/ipv6_sockglue.c | 4 |
8 files changed, 48 insertions, 13 deletions
diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c index 4bab322c9f8f..328759c32d61 100644 --- a/net/8021q/vlan_dev.c +++ b/net/8021q/vlan_dev.c | |||
| @@ -116,12 +116,22 @@ int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev, | |||
| 116 | struct packet_type* ptype, struct net_device *orig_dev) | 116 | struct packet_type* ptype, struct net_device *orig_dev) |
| 117 | { | 117 | { |
| 118 | unsigned char *rawp = NULL; | 118 | unsigned char *rawp = NULL; |
| 119 | struct vlan_hdr *vhdr = (struct vlan_hdr *)(skb->data); | 119 | struct vlan_hdr *vhdr; |
| 120 | unsigned short vid; | 120 | unsigned short vid; |
| 121 | struct net_device_stats *stats; | 121 | struct net_device_stats *stats; |
| 122 | unsigned short vlan_TCI; | 122 | unsigned short vlan_TCI; |
| 123 | __be16 proto; | 123 | __be16 proto; |
| 124 | 124 | ||
| 125 | if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) | ||
| 126 | return -1; | ||
| 127 | |||
| 128 | if (unlikely(!pskb_may_pull(skb, VLAN_HLEN))) { | ||
| 129 | kfree_skb(skb); | ||
| 130 | return -1; | ||
| 131 | } | ||
| 132 | |||
| 133 | vhdr = (struct vlan_hdr *)(skb->data); | ||
| 134 | |||
| 125 | /* vlan_TCI = ntohs(get_unaligned(&vhdr->h_vlan_TCI)); */ | 135 | /* vlan_TCI = ntohs(get_unaligned(&vhdr->h_vlan_TCI)); */ |
| 126 | vlan_TCI = ntohs(vhdr->h_vlan_TCI); | 136 | vlan_TCI = ntohs(vhdr->h_vlan_TCI); |
| 127 | 137 | ||
diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c index fa779874b9dd..3ee2022928e3 100644 --- a/net/bridge/br_netfilter.c +++ b/net/bridge/br_netfilter.c | |||
| @@ -509,8 +509,14 @@ static unsigned int br_nf_pre_routing(unsigned int hook, struct sk_buff **pskb, | |||
| 509 | int (*okfn)(struct sk_buff *)) | 509 | int (*okfn)(struct sk_buff *)) |
| 510 | { | 510 | { |
| 511 | struct iphdr *iph; | 511 | struct iphdr *iph; |
| 512 | __u32 len; | ||
| 513 | struct sk_buff *skb = *pskb; | 512 | struct sk_buff *skb = *pskb; |
| 513 | __u32 len = nf_bridge_encap_header_len(skb); | ||
| 514 | |||
| 515 | if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) | ||
| 516 | return NF_STOLEN; | ||
| 517 | |||
| 518 | if (unlikely(!pskb_may_pull(skb, len))) | ||
| 519 | goto out; | ||
| 514 | 520 | ||
| 515 | if (skb->protocol == htons(ETH_P_IPV6) || IS_VLAN_IPV6(skb) || | 521 | if (skb->protocol == htons(ETH_P_IPV6) || IS_VLAN_IPV6(skb) || |
| 516 | IS_PPPOE_IPV6(skb)) { | 522 | IS_PPPOE_IPV6(skb)) { |
| @@ -518,8 +524,6 @@ static unsigned int br_nf_pre_routing(unsigned int hook, struct sk_buff **pskb, | |||
| 518 | if (!brnf_call_ip6tables) | 524 | if (!brnf_call_ip6tables) |
| 519 | return NF_ACCEPT; | 525 | return NF_ACCEPT; |
| 520 | #endif | 526 | #endif |
| 521 | if ((skb = skb_share_check(*pskb, GFP_ATOMIC)) == NULL) | ||
| 522 | goto out; | ||
| 523 | nf_bridge_pull_encap_header_rcsum(skb); | 527 | nf_bridge_pull_encap_header_rcsum(skb); |
| 524 | return br_nf_pre_routing_ipv6(hook, skb, in, out, okfn); | 528 | return br_nf_pre_routing_ipv6(hook, skb, in, out, okfn); |
| 525 | } | 529 | } |
| @@ -532,8 +536,6 @@ static unsigned int br_nf_pre_routing(unsigned int hook, struct sk_buff **pskb, | |||
| 532 | !IS_PPPOE_IP(skb)) | 536 | !IS_PPPOE_IP(skb)) |
| 533 | return NF_ACCEPT; | 537 | return NF_ACCEPT; |
| 534 | 538 | ||
| 535 | if ((skb = skb_share_check(*pskb, GFP_ATOMIC)) == NULL) | ||
| 536 | goto out; | ||
| 537 | nf_bridge_pull_encap_header_rcsum(skb); | 539 | nf_bridge_pull_encap_header_rcsum(skb); |
| 538 | 540 | ||
| 539 | if (!pskb_may_pull(skb, sizeof(struct iphdr))) | 541 | if (!pskb_may_pull(skb, sizeof(struct iphdr))) |
diff --git a/net/core/dev_mcast.c b/net/core/dev_mcast.c index 99aece1aeccf..20330c572610 100644 --- a/net/core/dev_mcast.c +++ b/net/core/dev_mcast.c | |||
| @@ -116,11 +116,13 @@ int dev_mc_add(struct net_device *dev, void *addr, int alen, int glbl) | |||
| 116 | */ | 116 | */ |
| 117 | int dev_mc_sync(struct net_device *to, struct net_device *from) | 117 | int dev_mc_sync(struct net_device *to, struct net_device *from) |
| 118 | { | 118 | { |
| 119 | struct dev_addr_list *da; | 119 | struct dev_addr_list *da, *next; |
| 120 | int err = 0; | 120 | int err = 0; |
| 121 | 121 | ||
| 122 | netif_tx_lock_bh(to); | 122 | netif_tx_lock_bh(to); |
| 123 | for (da = from->mc_list; da != NULL; da = da->next) { | 123 | da = from->mc_list; |
| 124 | while (da != NULL) { | ||
| 125 | next = da->next; | ||
| 124 | if (!da->da_synced) { | 126 | if (!da->da_synced) { |
| 125 | err = __dev_addr_add(&to->mc_list, &to->mc_count, | 127 | err = __dev_addr_add(&to->mc_list, &to->mc_count, |
| 126 | da->da_addr, da->da_addrlen, 0); | 128 | da->da_addr, da->da_addrlen, 0); |
| @@ -134,6 +136,7 @@ int dev_mc_sync(struct net_device *to, struct net_device *from) | |||
| 134 | __dev_addr_delete(&from->mc_list, &from->mc_count, | 136 | __dev_addr_delete(&from->mc_list, &from->mc_count, |
| 135 | da->da_addr, da->da_addrlen, 0); | 137 | da->da_addr, da->da_addrlen, 0); |
| 136 | } | 138 | } |
| 139 | da = next; | ||
| 137 | } | 140 | } |
| 138 | if (!err) | 141 | if (!err) |
| 139 | __dev_set_rx_mode(to); | 142 | __dev_set_rx_mode(to); |
| @@ -156,12 +159,14 @@ EXPORT_SYMBOL(dev_mc_sync); | |||
| 156 | */ | 159 | */ |
| 157 | void dev_mc_unsync(struct net_device *to, struct net_device *from) | 160 | void dev_mc_unsync(struct net_device *to, struct net_device *from) |
| 158 | { | 161 | { |
| 159 | struct dev_addr_list *da; | 162 | struct dev_addr_list *da, *next; |
| 160 | 163 | ||
| 161 | netif_tx_lock_bh(from); | 164 | netif_tx_lock_bh(from); |
| 162 | netif_tx_lock_bh(to); | 165 | netif_tx_lock_bh(to); |
| 163 | 166 | ||
| 164 | for (da = from->mc_list; da != NULL; da = da->next) { | 167 | da = from->mc_list; |
| 168 | while (da != NULL) { | ||
| 169 | next = da->next; | ||
| 165 | if (!da->da_synced) | 170 | if (!da->da_synced) |
| 166 | continue; | 171 | continue; |
| 167 | __dev_addr_delete(&to->mc_list, &to->mc_count, | 172 | __dev_addr_delete(&to->mc_list, &to->mc_count, |
| @@ -169,6 +174,7 @@ void dev_mc_unsync(struct net_device *to, struct net_device *from) | |||
| 169 | da->da_synced = 0; | 174 | da->da_synced = 0; |
| 170 | __dev_addr_delete(&from->mc_list, &from->mc_count, | 175 | __dev_addr_delete(&from->mc_list, &from->mc_count, |
| 171 | da->da_addr, da->da_addrlen, 0); | 176 | da->da_addr, da->da_addrlen, 0); |
| 177 | da = next; | ||
| 172 | } | 178 | } |
| 173 | __dev_set_rx_mode(to); | 179 | __dev_set_rx_mode(to); |
| 174 | 180 | ||
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index ca2a1533138a..f7de8f24d8dd 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c | |||
| @@ -33,6 +33,7 @@ | |||
| 33 | #include <linux/rtnetlink.h> | 33 | #include <linux/rtnetlink.h> |
| 34 | #include <linux/random.h> | 34 | #include <linux/random.h> |
| 35 | #include <linux/string.h> | 35 | #include <linux/string.h> |
| 36 | #include <linux/log2.h> | ||
| 36 | 37 | ||
| 37 | #define NEIGH_DEBUG 1 | 38 | #define NEIGH_DEBUG 1 |
| 38 | 39 | ||
| @@ -311,7 +312,7 @@ static void neigh_hash_grow(struct neigh_table *tbl, unsigned long new_entries) | |||
| 311 | 312 | ||
| 312 | NEIGH_CACHE_STAT_INC(tbl, hash_grows); | 313 | NEIGH_CACHE_STAT_INC(tbl, hash_grows); |
| 313 | 314 | ||
| 314 | BUG_ON(new_entries & (new_entries - 1)); | 315 | BUG_ON(!is_power_of_2(new_entries)); |
| 315 | new_hash = neigh_hash_alloc(new_entries); | 316 | new_hash = neigh_hash_alloc(new_entries); |
| 316 | if (!new_hash) | 317 | if (!new_hash) |
| 317 | return; | 318 | return; |
diff --git a/net/ipv4/ah4.c b/net/ipv4/ah4.c index 7a23e59c374a..39f6211f1496 100644 --- a/net/ipv4/ah4.c +++ b/net/ipv4/ah4.c | |||
| @@ -46,7 +46,7 @@ static int ip_clear_mutable_options(struct iphdr *iph, __be32 *daddr) | |||
| 46 | memcpy(daddr, optptr+optlen-4, 4); | 46 | memcpy(daddr, optptr+optlen-4, 4); |
| 47 | /* Fall through */ | 47 | /* Fall through */ |
| 48 | default: | 48 | default: |
| 49 | memset(optptr+2, 0, optlen-2); | 49 | memset(optptr, 0, optlen); |
| 50 | } | 50 | } |
| 51 | l -= optlen; | 51 | l -= optlen; |
| 52 | optptr += optlen; | 52 | optptr += optlen; |
diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index 4d544573f48a..6b420aedcdcf 100644 --- a/net/ipv4/ip_sockglue.c +++ b/net/ipv4/ip_sockglue.c | |||
| @@ -625,6 +625,10 @@ static int do_ip_setsockopt(struct sock *sk, int level, | |||
| 625 | { | 625 | { |
| 626 | struct ip_mreqn mreq; | 626 | struct ip_mreqn mreq; |
| 627 | 627 | ||
| 628 | err = -EPROTO; | ||
| 629 | if (inet_sk(sk)->is_icsk) | ||
| 630 | break; | ||
| 631 | |||
| 628 | if (optlen < sizeof(struct ip_mreq)) | 632 | if (optlen < sizeof(struct ip_mreq)) |
| 629 | goto e_inval; | 633 | goto e_inval; |
| 630 | err = -EFAULT; | 634 | err = -EFAULT; |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index f030435e0eb4..9785df37a65f 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
| @@ -755,7 +755,15 @@ void tcp_update_metrics(struct sock *sk) | |||
| 755 | } | 755 | } |
| 756 | } | 756 | } |
| 757 | 757 | ||
| 758 | /* Numbers are taken from RFC2414. */ | 758 | /* Numbers are taken from RFC3390. |
| 759 | * | ||
| 760 | * John Heffner states: | ||
| 761 | * | ||
| 762 | * The RFC specifies a window of no more than 4380 bytes | ||
| 763 | * unless 2*MSS > 4380. Reading the pseudocode in the RFC | ||
| 764 | * is a bit misleading because they use a clamp at 4380 bytes | ||
| 765 | * rather than use a multiplier in the relevant range. | ||
| 766 | */ | ||
| 759 | __u32 tcp_init_cwnd(struct tcp_sock *tp, struct dst_entry *dst) | 767 | __u32 tcp_init_cwnd(struct tcp_sock *tp, struct dst_entry *dst) |
| 760 | { | 768 | { |
| 761 | __u32 cwnd = (dst ? dst_metric(dst, RTAX_INITCWND) : 0); | 769 | __u32 cwnd = (dst ? dst_metric(dst, RTAX_INITCWND) : 0); |
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c index 761a910f4f97..6b038aa72e88 100644 --- a/net/ipv6/ipv6_sockglue.c +++ b/net/ipv6/ipv6_sockglue.c | |||
| @@ -554,6 +554,10 @@ done: | |||
| 554 | { | 554 | { |
| 555 | struct ipv6_mreq mreq; | 555 | struct ipv6_mreq mreq; |
| 556 | 556 | ||
| 557 | retv = -EPROTO; | ||
| 558 | if (inet_sk(sk)->is_icsk) | ||
| 559 | break; | ||
| 560 | |||
| 557 | retv = -EFAULT; | 561 | retv = -EFAULT; |
| 558 | if (copy_from_user(&mreq, optval, sizeof(struct ipv6_mreq))) | 562 | if (copy_from_user(&mreq, optval, sizeof(struct ipv6_mreq))) |
| 559 | break; | 563 | break; |
