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 | |
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
-rw-r--r-- | drivers/atm/idt77105.c | 2 | ||||
-rw-r--r-- | drivers/atm/suni.c | 2 | ||||
-rw-r--r-- | drivers/net/e1000/e1000_main.c | 1 | ||||
-rw-r--r-- | drivers/net/e1000e/netdev.c | 1 | ||||
-rw-r--r-- | drivers/net/ixgb/ixgb_main.c | 9 | ||||
-rw-r--r-- | drivers/net/ixgbe/ixgbe_main.c | 4 | ||||
-rw-r--r-- | drivers/net/veth.c | 14 | ||||
-rw-r--r-- | net/bridge/br_netfilter.c | 27 | ||||
-rw-r--r-- | net/core/neighbour.c | 4 | ||||
-rw-r--r-- | net/core/rtnetlink.c | 5 | ||||
-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 | ||||
-rw-r--r-- | net/ipv6/icmp.c | 2 | ||||
-rw-r--r-- | net/ipv6/inet6_hashtables.c | 2 | ||||
-rw-r--r-- | net/ipv6/proc.c | 4 | ||||
-rw-r--r-- | net/ipv6/route.c | 11 | ||||
-rw-r--r-- | net/irda/af_irda.c | 30 | ||||
-rw-r--r-- | net/key/af_key.c | 16 | ||||
-rw-r--r-- | net/rfkill/rfkill.c | 5 |
20 files changed, 113 insertions, 53 deletions
diff --git a/drivers/atm/idt77105.c b/drivers/atm/idt77105.c index 0bd657f5dd2a..84672dc57f7a 100644 --- a/drivers/atm/idt77105.c +++ b/drivers/atm/idt77105.c | |||
@@ -357,7 +357,7 @@ static const struct atmphy_ops idt77105_ops = { | |||
357 | }; | 357 | }; |
358 | 358 | ||
359 | 359 | ||
360 | int __devinit idt77105_init(struct atm_dev *dev) | 360 | int idt77105_init(struct atm_dev *dev) |
361 | { | 361 | { |
362 | dev->phy = &idt77105_ops; | 362 | dev->phy = &idt77105_ops; |
363 | return 0; | 363 | return 0; |
diff --git a/drivers/atm/suni.c b/drivers/atm/suni.c index f04f39c00833..b1d063cc4fbe 100644 --- a/drivers/atm/suni.c +++ b/drivers/atm/suni.c | |||
@@ -289,7 +289,7 @@ static const struct atmphy_ops suni_ops = { | |||
289 | }; | 289 | }; |
290 | 290 | ||
291 | 291 | ||
292 | int __devinit suni_init(struct atm_dev *dev) | 292 | int suni_init(struct atm_dev *dev) |
293 | { | 293 | { |
294 | unsigned char mri; | 294 | unsigned char mri; |
295 | 295 | ||
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index 0c9a6f7104d2..76c0fa690cc6 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
@@ -632,6 +632,7 @@ e1000_down(struct e1000_adapter *adapter) | |||
632 | 632 | ||
633 | #ifdef CONFIG_E1000_NAPI | 633 | #ifdef CONFIG_E1000_NAPI |
634 | napi_disable(&adapter->napi); | 634 | napi_disable(&adapter->napi); |
635 | atomic_set(&adapter->irq_sem, 0); | ||
635 | #endif | 636 | #endif |
636 | e1000_irq_disable(adapter); | 637 | e1000_irq_disable(adapter); |
637 | 638 | ||
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index 2ab3bfbb8a63..9cc5a6b01bc1 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
@@ -2183,6 +2183,7 @@ void e1000e_down(struct e1000_adapter *adapter) | |||
2183 | msleep(10); | 2183 | msleep(10); |
2184 | 2184 | ||
2185 | napi_disable(&adapter->napi); | 2185 | napi_disable(&adapter->napi); |
2186 | atomic_set(&adapter->irq_sem, 0); | ||
2186 | e1000_irq_disable(adapter); | 2187 | e1000_irq_disable(adapter); |
2187 | 2188 | ||
2188 | del_timer_sync(&adapter->watchdog_timer); | 2189 | del_timer_sync(&adapter->watchdog_timer); |
diff --git a/drivers/net/ixgb/ixgb_main.c b/drivers/net/ixgb/ixgb_main.c index d2fb88d5cda2..4f63839051b0 100644 --- a/drivers/net/ixgb/ixgb_main.c +++ b/drivers/net/ixgb/ixgb_main.c | |||
@@ -296,6 +296,11 @@ ixgb_down(struct ixgb_adapter *adapter, boolean_t kill_watchdog) | |||
296 | { | 296 | { |
297 | struct net_device *netdev = adapter->netdev; | 297 | struct net_device *netdev = adapter->netdev; |
298 | 298 | ||
299 | #ifdef CONFIG_IXGB_NAPI | ||
300 | napi_disable(&adapter->napi); | ||
301 | atomic_set(&adapter->irq_sem, 0); | ||
302 | #endif | ||
303 | |||
299 | ixgb_irq_disable(adapter); | 304 | ixgb_irq_disable(adapter); |
300 | free_irq(adapter->pdev->irq, netdev); | 305 | free_irq(adapter->pdev->irq, netdev); |
301 | 306 | ||
@@ -304,9 +309,7 @@ ixgb_down(struct ixgb_adapter *adapter, boolean_t kill_watchdog) | |||
304 | 309 | ||
305 | if(kill_watchdog) | 310 | if(kill_watchdog) |
306 | del_timer_sync(&adapter->watchdog_timer); | 311 | del_timer_sync(&adapter->watchdog_timer); |
307 | #ifdef CONFIG_IXGB_NAPI | 312 | |
308 | napi_disable(&adapter->napi); | ||
309 | #endif | ||
310 | adapter->link_speed = 0; | 313 | adapter->link_speed = 0; |
311 | adapter->link_duplex = 0; | 314 | adapter->link_duplex = 0; |
312 | netif_carrier_off(netdev); | 315 | netif_carrier_off(netdev); |
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index de3f45e4c5ae..a4265bc1cebb 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
@@ -1409,9 +1409,11 @@ void ixgbe_down(struct ixgbe_adapter *adapter) | |||
1409 | IXGBE_WRITE_FLUSH(&adapter->hw); | 1409 | IXGBE_WRITE_FLUSH(&adapter->hw); |
1410 | msleep(10); | 1410 | msleep(10); |
1411 | 1411 | ||
1412 | napi_disable(&adapter->napi); | ||
1413 | atomic_set(&adapter->irq_sem, 0); | ||
1414 | |||
1412 | ixgbe_irq_disable(adapter); | 1415 | ixgbe_irq_disable(adapter); |
1413 | 1416 | ||
1414 | napi_disable(&adapter->napi); | ||
1415 | del_timer_sync(&adapter->watchdog_timer); | 1417 | del_timer_sync(&adapter->watchdog_timer); |
1416 | 1418 | ||
1417 | netif_carrier_off(netdev); | 1419 | netif_carrier_off(netdev); |
diff --git a/drivers/net/veth.c b/drivers/net/veth.c index 43af9e9b2652..3f67a29593bc 100644 --- a/drivers/net/veth.c +++ b/drivers/net/veth.c | |||
@@ -459,19 +459,7 @@ static __init int veth_init(void) | |||
459 | 459 | ||
460 | static __exit void veth_exit(void) | 460 | static __exit void veth_exit(void) |
461 | { | 461 | { |
462 | struct veth_priv *priv, *next; | 462 | rtnl_link_unregister(&veth_link_ops); |
463 | |||
464 | rtnl_lock(); | ||
465 | /* | ||
466 | * cannot trust __rtnl_link_unregister() to unregister all | ||
467 | * devices, as each ->dellink call will remove two devices | ||
468 | * from the list at once. | ||
469 | */ | ||
470 | list_for_each_entry_safe(priv, next, &veth_list, list) | ||
471 | veth_dellink(priv->dev); | ||
472 | |||
473 | __rtnl_link_unregister(&veth_link_ops); | ||
474 | rtnl_unlock(); | ||
475 | } | 463 | } |
476 | 464 | ||
477 | module_init(veth_init); | 465 | module_init(veth_init); |
diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c index 5d8b939eded1..9f78a69d6b8b 100644 --- a/net/bridge/br_netfilter.c +++ b/net/bridge/br_netfilter.c | |||
@@ -142,6 +142,23 @@ static inline struct nf_bridge_info *nf_bridge_alloc(struct sk_buff *skb) | |||
142 | return skb->nf_bridge; | 142 | return skb->nf_bridge; |
143 | } | 143 | } |
144 | 144 | ||
145 | static inline struct nf_bridge_info *nf_bridge_unshare(struct sk_buff *skb) | ||
146 | { | ||
147 | struct nf_bridge_info *nf_bridge = skb->nf_bridge; | ||
148 | |||
149 | if (atomic_read(&nf_bridge->use) > 1) { | ||
150 | struct nf_bridge_info *tmp = nf_bridge_alloc(skb); | ||
151 | |||
152 | if (tmp) { | ||
153 | memcpy(tmp, nf_bridge, sizeof(struct nf_bridge_info)); | ||
154 | atomic_set(&tmp->use, 1); | ||
155 | nf_bridge_put(nf_bridge); | ||
156 | } | ||
157 | nf_bridge = tmp; | ||
158 | } | ||
159 | return nf_bridge; | ||
160 | } | ||
161 | |||
145 | static inline void nf_bridge_push_encap_header(struct sk_buff *skb) | 162 | static inline void nf_bridge_push_encap_header(struct sk_buff *skb) |
146 | { | 163 | { |
147 | unsigned int len = nf_bridge_encap_header_len(skb); | 164 | unsigned int len = nf_bridge_encap_header_len(skb); |
@@ -637,6 +654,11 @@ static unsigned int br_nf_forward_ip(unsigned int hook, struct sk_buff *skb, | |||
637 | if (!skb->nf_bridge) | 654 | if (!skb->nf_bridge) |
638 | return NF_ACCEPT; | 655 | return NF_ACCEPT; |
639 | 656 | ||
657 | /* Need exclusive nf_bridge_info since we might have multiple | ||
658 | * different physoutdevs. */ | ||
659 | if (!nf_bridge_unshare(skb)) | ||
660 | return NF_DROP; | ||
661 | |||
640 | parent = bridge_parent(out); | 662 | parent = bridge_parent(out); |
641 | if (!parent) | 663 | if (!parent) |
642 | return NF_DROP; | 664 | return NF_DROP; |
@@ -718,6 +740,11 @@ static unsigned int br_nf_local_out(unsigned int hook, struct sk_buff *skb, | |||
718 | if (!skb->nf_bridge) | 740 | if (!skb->nf_bridge) |
719 | return NF_ACCEPT; | 741 | return NF_ACCEPT; |
720 | 742 | ||
743 | /* Need exclusive nf_bridge_info since we might have multiple | ||
744 | * different physoutdevs. */ | ||
745 | if (!nf_bridge_unshare(skb)) | ||
746 | return NF_DROP; | ||
747 | |||
721 | nf_bridge = skb->nf_bridge; | 748 | nf_bridge = skb->nf_bridge; |
722 | if (!(nf_bridge->mask & BRNF_BRIDGED_DNAT)) | 749 | if (!(nf_bridge->mask & BRNF_BRIDGED_DNAT)) |
723 | return NF_ACCEPT; | 750 | return NF_ACCEPT; |
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index cc8a2f190acf..29b8ee4e35d6 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c | |||
@@ -1316,6 +1316,8 @@ void neigh_parms_release(struct neigh_table *tbl, struct neigh_parms *parms) | |||
1316 | *p = parms->next; | 1316 | *p = parms->next; |
1317 | parms->dead = 1; | 1317 | parms->dead = 1; |
1318 | write_unlock_bh(&tbl->lock); | 1318 | write_unlock_bh(&tbl->lock); |
1319 | if (parms->dev) | ||
1320 | dev_put(parms->dev); | ||
1319 | call_rcu(&parms->rcu_head, neigh_rcu_free_parms); | 1321 | call_rcu(&parms->rcu_head, neigh_rcu_free_parms); |
1320 | return; | 1322 | return; |
1321 | } | 1323 | } |
@@ -1326,8 +1328,6 @@ void neigh_parms_release(struct neigh_table *tbl, struct neigh_parms *parms) | |||
1326 | 1328 | ||
1327 | void neigh_parms_destroy(struct neigh_parms *parms) | 1329 | void neigh_parms_destroy(struct neigh_parms *parms) |
1328 | { | 1330 | { |
1329 | if (parms->dev) | ||
1330 | dev_put(parms->dev); | ||
1331 | kfree(parms); | 1331 | kfree(parms); |
1332 | } | 1332 | } |
1333 | 1333 | ||
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index e1ba26fb4bf2..fed95a323b28 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -308,9 +308,12 @@ void __rtnl_link_unregister(struct rtnl_link_ops *ops) | |||
308 | struct net *net; | 308 | struct net *net; |
309 | 309 | ||
310 | for_each_net(net) { | 310 | for_each_net(net) { |
311 | restart: | ||
311 | for_each_netdev_safe(net, dev, n) { | 312 | for_each_netdev_safe(net, dev, n) { |
312 | if (dev->rtnl_link_ops == ops) | 313 | if (dev->rtnl_link_ops == ops) { |
313 | ops->dellink(dev); | 314 | ops->dellink(dev); |
315 | goto restart; | ||
316 | } | ||
314 | } | 317 | } |
315 | } | 318 | } |
316 | list_del(&ops->list); | 319 | list_del(&ops->list); |
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; |
diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c index 9bb031fa1c2f..f1240688dc58 100644 --- a/net/ipv6/icmp.c +++ b/net/ipv6/icmp.c | |||
@@ -458,8 +458,6 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info, | |||
458 | } | 458 | } |
459 | err = icmpv6_push_pending_frames(sk, &fl, &tmp_hdr, len + sizeof(struct icmp6hdr)); | 459 | err = icmpv6_push_pending_frames(sk, &fl, &tmp_hdr, len + sizeof(struct icmp6hdr)); |
460 | 460 | ||
461 | ICMP6_INC_STATS_BH(idev, ICMP6_MIB_OUTMSGS); | ||
462 | |||
463 | out_put: | 461 | out_put: |
464 | if (likely(idev != NULL)) | 462 | if (likely(idev != NULL)) |
465 | in6_dev_put(idev); | 463 | in6_dev_put(idev); |
diff --git a/net/ipv6/inet6_hashtables.c b/net/ipv6/inet6_hashtables.c index adc73adadfae..0765d8bd380f 100644 --- a/net/ipv6/inet6_hashtables.c +++ b/net/ipv6/inet6_hashtables.c | |||
@@ -193,7 +193,7 @@ static int __inet6_check_established(struct inet_timewait_death_row *death_row, | |||
193 | sk2->sk_family == PF_INET6 && | 193 | sk2->sk_family == PF_INET6 && |
194 | ipv6_addr_equal(&tw6->tw_v6_daddr, saddr) && | 194 | ipv6_addr_equal(&tw6->tw_v6_daddr, saddr) && |
195 | ipv6_addr_equal(&tw6->tw_v6_rcv_saddr, daddr) && | 195 | ipv6_addr_equal(&tw6->tw_v6_rcv_saddr, daddr) && |
196 | sk2->sk_bound_dev_if == sk->sk_bound_dev_if) { | 196 | (!sk2->sk_bound_dev_if || sk2->sk_bound_dev_if == dif)) { |
197 | if (twsk_unique(sk, sk2, twp)) | 197 | if (twsk_unique(sk, sk2, twp)) |
198 | goto unique; | 198 | goto unique; |
199 | else | 199 | else |
diff --git a/net/ipv6/proc.c b/net/ipv6/proc.c index 8631ed7fe8a9..44937616057e 100644 --- a/net/ipv6/proc.c +++ b/net/ipv6/proc.c | |||
@@ -88,7 +88,7 @@ static char *icmp6type2name[256] = { | |||
88 | [ICMPV6_PKT_TOOBIG] = "PktTooBigs", | 88 | [ICMPV6_PKT_TOOBIG] = "PktTooBigs", |
89 | [ICMPV6_TIME_EXCEED] = "TimeExcds", | 89 | [ICMPV6_TIME_EXCEED] = "TimeExcds", |
90 | [ICMPV6_PARAMPROB] = "ParmProblems", | 90 | [ICMPV6_PARAMPROB] = "ParmProblems", |
91 | [ICMPV6_ECHO_REQUEST] = "EchoRequest", | 91 | [ICMPV6_ECHO_REQUEST] = "Echos", |
92 | [ICMPV6_ECHO_REPLY] = "EchoReplies", | 92 | [ICMPV6_ECHO_REPLY] = "EchoReplies", |
93 | [ICMPV6_MGM_QUERY] = "GroupMembQueries", | 93 | [ICMPV6_MGM_QUERY] = "GroupMembQueries", |
94 | [ICMPV6_MGM_REPORT] = "GroupMembResponses", | 94 | [ICMPV6_MGM_REPORT] = "GroupMembResponses", |
@@ -98,7 +98,7 @@ static char *icmp6type2name[256] = { | |||
98 | [NDISC_ROUTER_SOLICITATION] = "RouterSolicits", | 98 | [NDISC_ROUTER_SOLICITATION] = "RouterSolicits", |
99 | [NDISC_NEIGHBOUR_ADVERTISEMENT] = "NeighborAdvertisements", | 99 | [NDISC_NEIGHBOUR_ADVERTISEMENT] = "NeighborAdvertisements", |
100 | [NDISC_NEIGHBOUR_SOLICITATION] = "NeighborSolicits", | 100 | [NDISC_NEIGHBOUR_SOLICITATION] = "NeighborSolicits", |
101 | [NDISC_REDIRECT] = "NeighborRedirects", | 101 | [NDISC_REDIRECT] = "Redirects", |
102 | }; | 102 | }; |
103 | 103 | ||
104 | 104 | ||
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 6ecb5e6fae2e..20083e0d3995 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -329,7 +329,7 @@ static inline int rt6_check_dev(struct rt6_info *rt, int oif) | |||
329 | static inline int rt6_check_neigh(struct rt6_info *rt) | 329 | static inline int rt6_check_neigh(struct rt6_info *rt) |
330 | { | 330 | { |
331 | struct neighbour *neigh = rt->rt6i_nexthop; | 331 | struct neighbour *neigh = rt->rt6i_nexthop; |
332 | int m = 0; | 332 | int m; |
333 | if (rt->rt6i_flags & RTF_NONEXTHOP || | 333 | if (rt->rt6i_flags & RTF_NONEXTHOP || |
334 | !(rt->rt6i_flags & RTF_GATEWAY)) | 334 | !(rt->rt6i_flags & RTF_GATEWAY)) |
335 | m = 1; | 335 | m = 1; |
@@ -337,10 +337,15 @@ static inline int rt6_check_neigh(struct rt6_info *rt) | |||
337 | read_lock_bh(&neigh->lock); | 337 | read_lock_bh(&neigh->lock); |
338 | if (neigh->nud_state & NUD_VALID) | 338 | if (neigh->nud_state & NUD_VALID) |
339 | m = 2; | 339 | m = 2; |
340 | else if (!(neigh->nud_state & NUD_FAILED)) | 340 | #ifdef CONFIG_IPV6_ROUTER_PREF |
341 | else if (neigh->nud_state & NUD_FAILED) | ||
342 | m = 0; | ||
343 | #endif | ||
344 | else | ||
341 | m = 1; | 345 | m = 1; |
342 | read_unlock_bh(&neigh->lock); | 346 | read_unlock_bh(&neigh->lock); |
343 | } | 347 | } else |
348 | m = 0; | ||
344 | return m; | 349 | return m; |
345 | } | 350 | } |
346 | 351 | ||
diff --git a/net/irda/af_irda.c b/net/irda/af_irda.c index d5e4dd75200b..07dfa7fdd2a0 100644 --- a/net/irda/af_irda.c +++ b/net/irda/af_irda.c | |||
@@ -802,12 +802,18 @@ static int irda_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | |||
802 | } | 802 | } |
803 | #endif /* CONFIG_IRDA_ULTRA */ | 803 | #endif /* CONFIG_IRDA_ULTRA */ |
804 | 804 | ||
805 | self->ias_obj = irias_new_object(addr->sir_name, jiffies); | ||
806 | if (self->ias_obj == NULL) | ||
807 | return -ENOMEM; | ||
808 | |||
805 | err = irda_open_tsap(self, addr->sir_lsap_sel, addr->sir_name); | 809 | err = irda_open_tsap(self, addr->sir_lsap_sel, addr->sir_name); |
806 | if (err < 0) | 810 | if (err < 0) { |
811 | kfree(self->ias_obj->name); | ||
812 | kfree(self->ias_obj); | ||
807 | return err; | 813 | return err; |
814 | } | ||
808 | 815 | ||
809 | /* Register with LM-IAS */ | 816 | /* Register with LM-IAS */ |
810 | self->ias_obj = irias_new_object(addr->sir_name, jiffies); | ||
811 | irias_add_integer_attrib(self->ias_obj, "IrDA:TinyTP:LsapSel", | 817 | irias_add_integer_attrib(self->ias_obj, "IrDA:TinyTP:LsapSel", |
812 | self->stsap_sel, IAS_KERNEL_ATTR); | 818 | self->stsap_sel, IAS_KERNEL_ATTR); |
813 | irias_insert_object(self->ias_obj); | 819 | irias_insert_object(self->ias_obj); |
@@ -1825,7 +1831,7 @@ static int irda_setsockopt(struct socket *sock, int level, int optname, | |||
1825 | struct irda_ias_set *ias_opt; | 1831 | struct irda_ias_set *ias_opt; |
1826 | struct ias_object *ias_obj; | 1832 | struct ias_object *ias_obj; |
1827 | struct ias_attrib * ias_attr; /* Attribute in IAS object */ | 1833 | struct ias_attrib * ias_attr; /* Attribute in IAS object */ |
1828 | int opt; | 1834 | int opt, free_ias = 0; |
1829 | 1835 | ||
1830 | IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); | 1836 | IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); |
1831 | 1837 | ||
@@ -1881,11 +1887,20 @@ static int irda_setsockopt(struct socket *sock, int level, int optname, | |||
1881 | /* Create a new object */ | 1887 | /* Create a new object */ |
1882 | ias_obj = irias_new_object(ias_opt->irda_class_name, | 1888 | ias_obj = irias_new_object(ias_opt->irda_class_name, |
1883 | jiffies); | 1889 | jiffies); |
1890 | if (ias_obj == NULL) { | ||
1891 | kfree(ias_opt); | ||
1892 | return -ENOMEM; | ||
1893 | } | ||
1894 | free_ias = 1; | ||
1884 | } | 1895 | } |
1885 | 1896 | ||
1886 | /* Do we have the attribute already ? */ | 1897 | /* Do we have the attribute already ? */ |
1887 | if(irias_find_attrib(ias_obj, ias_opt->irda_attrib_name)) { | 1898 | if(irias_find_attrib(ias_obj, ias_opt->irda_attrib_name)) { |
1888 | kfree(ias_opt); | 1899 | kfree(ias_opt); |
1900 | if (free_ias) { | ||
1901 | kfree(ias_obj->name); | ||
1902 | kfree(ias_obj); | ||
1903 | } | ||
1889 | return -EINVAL; | 1904 | return -EINVAL; |
1890 | } | 1905 | } |
1891 | 1906 | ||
@@ -1904,6 +1919,11 @@ static int irda_setsockopt(struct socket *sock, int level, int optname, | |||
1904 | if(ias_opt->attribute.irda_attrib_octet_seq.len > | 1919 | if(ias_opt->attribute.irda_attrib_octet_seq.len > |
1905 | IAS_MAX_OCTET_STRING) { | 1920 | IAS_MAX_OCTET_STRING) { |
1906 | kfree(ias_opt); | 1921 | kfree(ias_opt); |
1922 | if (free_ias) { | ||
1923 | kfree(ias_obj->name); | ||
1924 | kfree(ias_obj); | ||
1925 | } | ||
1926 | |||
1907 | return -EINVAL; | 1927 | return -EINVAL; |
1908 | } | 1928 | } |
1909 | /* Add an octet sequence attribute */ | 1929 | /* Add an octet sequence attribute */ |
@@ -1932,6 +1952,10 @@ static int irda_setsockopt(struct socket *sock, int level, int optname, | |||
1932 | break; | 1952 | break; |
1933 | default : | 1953 | default : |
1934 | kfree(ias_opt); | 1954 | kfree(ias_opt); |
1955 | if (free_ias) { | ||
1956 | kfree(ias_obj->name); | ||
1957 | kfree(ias_obj); | ||
1958 | } | ||
1935 | return -EINVAL; | 1959 | return -EINVAL; |
1936 | } | 1960 | } |
1937 | irias_insert_object(ias_obj); | 1961 | irias_insert_object(ias_obj); |
diff --git a/net/key/af_key.c b/net/key/af_key.c index 26d5e63c4cc5..76dcd882f87b 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c | |||
@@ -3593,27 +3593,29 @@ static int pfkey_send_migrate(struct xfrm_selector *sel, u8 dir, u8 type, | |||
3593 | /* old ipsecrequest */ | 3593 | /* old ipsecrequest */ |
3594 | int mode = pfkey_mode_from_xfrm(mp->mode); | 3594 | int mode = pfkey_mode_from_xfrm(mp->mode); |
3595 | if (mode < 0) | 3595 | if (mode < 0) |
3596 | return -EINVAL; | 3596 | goto err; |
3597 | if (set_ipsecrequest(skb, mp->proto, mode, | 3597 | if (set_ipsecrequest(skb, mp->proto, mode, |
3598 | (mp->reqid ? IPSEC_LEVEL_UNIQUE : IPSEC_LEVEL_REQUIRE), | 3598 | (mp->reqid ? IPSEC_LEVEL_UNIQUE : IPSEC_LEVEL_REQUIRE), |
3599 | mp->reqid, mp->old_family, | 3599 | mp->reqid, mp->old_family, |
3600 | &mp->old_saddr, &mp->old_daddr) < 0) { | 3600 | &mp->old_saddr, &mp->old_daddr) < 0) |
3601 | return -EINVAL; | 3601 | goto err; |
3602 | } | ||
3603 | 3602 | ||
3604 | /* new ipsecrequest */ | 3603 | /* new ipsecrequest */ |
3605 | if (set_ipsecrequest(skb, mp->proto, mode, | 3604 | if (set_ipsecrequest(skb, mp->proto, mode, |
3606 | (mp->reqid ? IPSEC_LEVEL_UNIQUE : IPSEC_LEVEL_REQUIRE), | 3605 | (mp->reqid ? IPSEC_LEVEL_UNIQUE : IPSEC_LEVEL_REQUIRE), |
3607 | mp->reqid, mp->new_family, | 3606 | mp->reqid, mp->new_family, |
3608 | &mp->new_saddr, &mp->new_daddr) < 0) { | 3607 | &mp->new_saddr, &mp->new_daddr) < 0) |
3609 | return -EINVAL; | 3608 | goto err; |
3610 | } | ||
3611 | } | 3609 | } |
3612 | 3610 | ||
3613 | /* broadcast migrate message to sockets */ | 3611 | /* broadcast migrate message to sockets */ |
3614 | pfkey_broadcast(skb, GFP_ATOMIC, BROADCAST_ALL, NULL); | 3612 | pfkey_broadcast(skb, GFP_ATOMIC, BROADCAST_ALL, NULL); |
3615 | 3613 | ||
3616 | return 0; | 3614 | return 0; |
3615 | |||
3616 | err: | ||
3617 | kfree_skb(skb); | ||
3618 | return -EINVAL; | ||
3617 | } | 3619 | } |
3618 | #else | 3620 | #else |
3619 | static int pfkey_send_migrate(struct xfrm_selector *sel, u8 dir, u8 type, | 3621 | static int pfkey_send_migrate(struct xfrm_selector *sel, u8 dir, u8 type, |
diff --git a/net/rfkill/rfkill.c b/net/rfkill/rfkill.c index 4469a7be006c..d06d338812e9 100644 --- a/net/rfkill/rfkill.c +++ b/net/rfkill/rfkill.c | |||
@@ -392,11 +392,14 @@ int rfkill_register(struct rfkill *rfkill) | |||
392 | rfkill_led_trigger_register(rfkill); | 392 | rfkill_led_trigger_register(rfkill); |
393 | 393 | ||
394 | error = rfkill_add_switch(rfkill); | 394 | error = rfkill_add_switch(rfkill); |
395 | if (error) | 395 | if (error) { |
396 | rfkill_led_trigger_unregister(rfkill); | ||
396 | return error; | 397 | return error; |
398 | } | ||
397 | 399 | ||
398 | error = device_add(dev); | 400 | error = device_add(dev); |
399 | if (error) { | 401 | if (error) { |
402 | rfkill_led_trigger_unregister(rfkill); | ||
400 | rfkill_remove_switch(rfkill); | 403 | rfkill_remove_switch(rfkill); |
401 | return error; | 404 | return error; |
402 | } | 405 | } |