diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-01-21 22:42:25 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-01-21 22:42:25 -0500 |
commit | f290fc3669d659a915e29b6bdb82d454b437cf93 (patch) | |
tree | 1c6d7122e4462f15f6db05255c7cd89badcb576f /net/ipv4 | |
parent | 240d3b54e3a8a8d469f0ff6deacf52f4b751f55a (diff) | |
parent | 5b4d383a1a562de6955cacd72e20809064ee137f (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6:
[ICMP]: ICMP_MIB_OUTMSGS increment duplicated
[IPV6]: RFC 2011 compatibility broken
[IPV6]: ICMP6_MIB_OUTMSGS increment duplicated
[NET]: rtnl_link: fix use-after-free
[AF_KEY]: Fix skb leak on pfkey_send_migrate() error
[ATM] atm/suni.c: Fix section mismatch.
[ATM] atm/idt77105.c: Fix section mismatch.
[IrDA]: af_irda memory leak fixes
[NEIGH]: Revert 'Fix race between neigh_parms_release and neightbl_fill_parms'
[NETFILTER]: bridge-netfilter: fix net_device refcnt leaks
[IPV6] ROUTE: Make sending algorithm more friendly with RFC 4861.
[IPV4] FIB_HASH : Avoid unecessary loop in fn_hash_dump_zone()
[NET]: Fix interrupt semaphore corruption in Intel drivers.
[IPV4] fib_trie: fix duplicated route issue
[IPV4] fib_hash: fix duplicated route issue
[IPV6]: Mischecked tw match in __inet6_check_established.
rfkill: call rfkill_led_trigger_unregister() on error
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/fib_hash.c | 23 | ||||
-rw-r--r-- | net/ipv4/fib_trie.c | 3 | ||||
-rw-r--r-- | net/ipv4/icmp.c | 1 |
3 files changed, 15 insertions, 12 deletions
diff --git a/net/ipv4/fib_hash.c b/net/ipv4/fib_hash.c index 527a6e0af5b6..0dfee27cfbcd 100644 --- a/net/ipv4/fib_hash.c +++ b/net/ipv4/fib_hash.c | |||
@@ -444,6 +444,9 @@ static int fn_hash_insert(struct fib_table *tb, struct fib_config *cfg) | |||
444 | struct fib_info *fi_drop; | 444 | struct fib_info *fi_drop; |
445 | u8 state; | 445 | u8 state; |
446 | 446 | ||
447 | if (fi->fib_treeref > 1) | ||
448 | goto out; | ||
449 | |||
447 | write_lock_bh(&fib_hash_lock); | 450 | write_lock_bh(&fib_hash_lock); |
448 | fi_drop = fa->fa_info; | 451 | fi_drop = fa->fa_info; |
449 | fa->fa_info = fi; | 452 | fa->fa_info = fi; |
@@ -718,19 +721,18 @@ fn_hash_dump_zone(struct sk_buff *skb, struct netlink_callback *cb, | |||
718 | { | 721 | { |
719 | int h, s_h; | 722 | int h, s_h; |
720 | 723 | ||
724 | if (fz->fz_hash == NULL) | ||
725 | return skb->len; | ||
721 | s_h = cb->args[3]; | 726 | s_h = cb->args[3]; |
722 | for (h=0; h < fz->fz_divisor; h++) { | 727 | for (h = s_h; h < fz->fz_divisor; h++) { |
723 | if (h < s_h) continue; | 728 | if (hlist_empty(&fz->fz_hash[h])) |
724 | if (h > s_h) | ||
725 | memset(&cb->args[4], 0, | ||
726 | sizeof(cb->args) - 4*sizeof(cb->args[0])); | ||
727 | if (fz->fz_hash == NULL || | ||
728 | hlist_empty(&fz->fz_hash[h])) | ||
729 | continue; | 729 | continue; |
730 | if (fn_hash_dump_bucket(skb, cb, tb, fz, &fz->fz_hash[h])<0) { | 730 | if (fn_hash_dump_bucket(skb, cb, tb, fz, &fz->fz_hash[h]) < 0) { |
731 | cb->args[3] = h; | 731 | cb->args[3] = h; |
732 | return -1; | 732 | return -1; |
733 | } | 733 | } |
734 | memset(&cb->args[4], 0, | ||
735 | sizeof(cb->args) - 4*sizeof(cb->args[0])); | ||
734 | } | 736 | } |
735 | cb->args[3] = h; | 737 | cb->args[3] = h; |
736 | return skb->len; | 738 | return skb->len; |
@@ -746,14 +748,13 @@ static int fn_hash_dump(struct fib_table *tb, struct sk_buff *skb, struct netlin | |||
746 | read_lock(&fib_hash_lock); | 748 | read_lock(&fib_hash_lock); |
747 | for (fz = table->fn_zone_list, m=0; fz; fz = fz->fz_next, m++) { | 749 | for (fz = table->fn_zone_list, m=0; fz; fz = fz->fz_next, m++) { |
748 | if (m < s_m) continue; | 750 | if (m < s_m) continue; |
749 | if (m > s_m) | ||
750 | memset(&cb->args[3], 0, | ||
751 | sizeof(cb->args) - 3*sizeof(cb->args[0])); | ||
752 | if (fn_hash_dump_zone(skb, cb, tb, fz) < 0) { | 751 | if (fn_hash_dump_zone(skb, cb, tb, fz) < 0) { |
753 | cb->args[2] = m; | 752 | cb->args[2] = m; |
754 | read_unlock(&fib_hash_lock); | 753 | read_unlock(&fib_hash_lock); |
755 | return -1; | 754 | return -1; |
756 | } | 755 | } |
756 | memset(&cb->args[3], 0, | ||
757 | sizeof(cb->args) - 3*sizeof(cb->args[0])); | ||
757 | } | 758 | } |
758 | read_unlock(&fib_hash_lock); | 759 | read_unlock(&fib_hash_lock); |
759 | cb->args[2] = m; | 760 | cb->args[2] = m; |
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index 8d8c2915e064..1010b469d7d3 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c | |||
@@ -1214,6 +1214,9 @@ static int fn_trie_insert(struct fib_table *tb, struct fib_config *cfg) | |||
1214 | struct fib_info *fi_drop; | 1214 | struct fib_info *fi_drop; |
1215 | u8 state; | 1215 | u8 state; |
1216 | 1216 | ||
1217 | if (fi->fib_treeref > 1) | ||
1218 | goto out; | ||
1219 | |||
1217 | err = -ENOBUFS; | 1220 | err = -ENOBUFS; |
1218 | new_fa = kmem_cache_alloc(fn_alias_kmem, GFP_KERNEL); | 1221 | new_fa = kmem_cache_alloc(fn_alias_kmem, GFP_KERNEL); |
1219 | if (new_fa == NULL) | 1222 | if (new_fa == NULL) |
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c index 233de0634298..82baea026484 100644 --- a/net/ipv4/icmp.c +++ b/net/ipv4/icmp.c | |||
@@ -540,7 +540,6 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info) | |||
540 | icmp_param.data.icmph.checksum = 0; | 540 | icmp_param.data.icmph.checksum = 0; |
541 | icmp_param.skb = skb_in; | 541 | icmp_param.skb = skb_in; |
542 | icmp_param.offset = skb_network_offset(skb_in); | 542 | icmp_param.offset = skb_network_offset(skb_in); |
543 | icmp_out_count(icmp_param.data.icmph.type); | ||
544 | inet_sk(icmp_socket->sk)->tos = tos; | 543 | inet_sk(icmp_socket->sk)->tos = tos; |
545 | ipc.addr = iph->saddr; | 544 | ipc.addr = iph->saddr; |
546 | ipc.opt = &icmp_param.replyopts; | 545 | ipc.opt = &icmp_param.replyopts; |