diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-28 12:44:11 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-28 12:44:11 -0400 |
commit | 77a50df2b14c8d3ee3c58c21c4a0e0157570df09 (patch) | |
tree | 0e324a712e5e768c8353b0b5ba6ddc31095479f0 /net | |
parent | 96fffeb4b413a4f8f65bb627d59b7dfc97ea0b39 (diff) | |
parent | 358c12953b88c5a06a57c33eb27c753b2e7934d1 (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:
iwlwifi: Allow building iwl3945 without iwl4965.
wireless: Fix compile error with wifi & leds
tcp: Fix slab corruption with ipv6 and tcp6fuzz
ipv4/ipv6 compat: Fix SSM applications on 64bit kernels.
[IPSEC]: Use digest_null directly for auth
sunrpc: fix missing kernel-doc
can: Fix copy_from_user() results interpretation
Revert "ipv6: Fix typo in net/ipv6/Kconfig"
tipc: endianness annotations
ipv6: result of csum_fold() is already 16bit, no need to cast
[XFRM] AUDIT: Fix flowlabel text format ambibuity.
Diffstat (limited to 'net')
-rw-r--r-- | net/can/raw.c | 21 | ||||
-rw-r--r-- | net/compat.c | 117 | ||||
-rw-r--r-- | net/ipv4/ip_sockglue.c | 5 | ||||
-rw-r--r-- | net/ipv4/tcp_input.c | 3 | ||||
-rw-r--r-- | net/ipv6/Kconfig | 2 | ||||
-rw-r--r-- | net/ipv6/ip6mr.c | 2 | ||||
-rw-r--r-- | net/ipv6/ipv6_sockglue.c | 5 | ||||
-rw-r--r-- | net/mac80211/Kconfig | 4 | ||||
-rw-r--r-- | net/sunrpc/xprt.c | 2 | ||||
-rw-r--r-- | net/tipc/msg.h | 7 | ||||
-rw-r--r-- | net/xfrm/xfrm_algo.c | 3 | ||||
-rw-r--r-- | net/xfrm/xfrm_state.c | 2 |
12 files changed, 149 insertions, 24 deletions
diff --git a/net/can/raw.c b/net/can/raw.c index 201cbfc6b9e..69877b8e7e9 100644 --- a/net/can/raw.c +++ b/net/can/raw.c | |||
@@ -435,15 +435,13 @@ static int raw_setsockopt(struct socket *sock, int level, int optname, | |||
435 | if (!filter) | 435 | if (!filter) |
436 | return -ENOMEM; | 436 | return -ENOMEM; |
437 | 437 | ||
438 | err = copy_from_user(filter, optval, optlen); | 438 | if (copy_from_user(filter, optval, optlen)) { |
439 | if (err) { | ||
440 | kfree(filter); | 439 | kfree(filter); |
441 | return err; | 440 | return -EFAULT; |
442 | } | 441 | } |
443 | } else if (count == 1) { | 442 | } else if (count == 1) { |
444 | err = copy_from_user(&sfilter, optval, optlen); | 443 | if (copy_from_user(&sfilter, optval, optlen)) |
445 | if (err) | 444 | return -EFAULT; |
446 | return err; | ||
447 | } | 445 | } |
448 | 446 | ||
449 | lock_sock(sk); | 447 | lock_sock(sk); |
@@ -493,9 +491,8 @@ static int raw_setsockopt(struct socket *sock, int level, int optname, | |||
493 | if (optlen != sizeof(err_mask)) | 491 | if (optlen != sizeof(err_mask)) |
494 | return -EINVAL; | 492 | return -EINVAL; |
495 | 493 | ||
496 | err = copy_from_user(&err_mask, optval, optlen); | 494 | if (copy_from_user(&err_mask, optval, optlen)) |
497 | if (err) | 495 | return -EFAULT; |
498 | return err; | ||
499 | 496 | ||
500 | err_mask &= CAN_ERR_MASK; | 497 | err_mask &= CAN_ERR_MASK; |
501 | 498 | ||
@@ -531,7 +528,8 @@ static int raw_setsockopt(struct socket *sock, int level, int optname, | |||
531 | if (optlen != sizeof(ro->loopback)) | 528 | if (optlen != sizeof(ro->loopback)) |
532 | return -EINVAL; | 529 | return -EINVAL; |
533 | 530 | ||
534 | err = copy_from_user(&ro->loopback, optval, optlen); | 531 | if (copy_from_user(&ro->loopback, optval, optlen)) |
532 | return -EFAULT; | ||
535 | 533 | ||
536 | break; | 534 | break; |
537 | 535 | ||
@@ -539,7 +537,8 @@ static int raw_setsockopt(struct socket *sock, int level, int optname, | |||
539 | if (optlen != sizeof(ro->recv_own_msgs)) | 537 | if (optlen != sizeof(ro->recv_own_msgs)) |
540 | return -EINVAL; | 538 | return -EINVAL; |
541 | 539 | ||
542 | err = copy_from_user(&ro->recv_own_msgs, optval, optlen); | 540 | if (copy_from_user(&ro->recv_own_msgs, optval, optlen)) |
541 | return -EFAULT; | ||
543 | 542 | ||
544 | break; | 543 | break; |
545 | 544 | ||
diff --git a/net/compat.c b/net/compat.c index 80013fb69a6..01bf95d0832 100644 --- a/net/compat.c +++ b/net/compat.c | |||
@@ -24,6 +24,8 @@ | |||
24 | 24 | ||
25 | #include <net/scm.h> | 25 | #include <net/scm.h> |
26 | #include <net/sock.h> | 26 | #include <net/sock.h> |
27 | #include <net/ip.h> | ||
28 | #include <net/ipv6.h> | ||
27 | #include <asm/uaccess.h> | 29 | #include <asm/uaccess.h> |
28 | #include <net/compat.h> | 30 | #include <net/compat.h> |
29 | 31 | ||
@@ -521,6 +523,121 @@ asmlinkage long compat_sys_getsockopt(int fd, int level, int optname, | |||
521 | } | 523 | } |
522 | return err; | 524 | return err; |
523 | } | 525 | } |
526 | |||
527 | struct compat_group_req { | ||
528 | __u32 gr_interface; | ||
529 | struct __kernel_sockaddr_storage gr_group | ||
530 | __attribute__ ((aligned(4))); | ||
531 | } __attribute__ ((packed)); | ||
532 | |||
533 | struct compat_group_source_req { | ||
534 | __u32 gsr_interface; | ||
535 | struct __kernel_sockaddr_storage gsr_group | ||
536 | __attribute__ ((aligned(4))); | ||
537 | struct __kernel_sockaddr_storage gsr_source | ||
538 | __attribute__ ((aligned(4))); | ||
539 | } __attribute__ ((packed)); | ||
540 | |||
541 | struct compat_group_filter { | ||
542 | __u32 gf_interface; | ||
543 | struct __kernel_sockaddr_storage gf_group | ||
544 | __attribute__ ((aligned(4))); | ||
545 | __u32 gf_fmode; | ||
546 | __u32 gf_numsrc; | ||
547 | struct __kernel_sockaddr_storage gf_slist[1] | ||
548 | __attribute__ ((aligned(4))); | ||
549 | } __attribute__ ((packed)); | ||
550 | |||
551 | |||
552 | int compat_mc_setsockopt(struct sock *sock, int level, int optname, | ||
553 | char __user *optval, int optlen, | ||
554 | int (*setsockopt)(struct sock *,int,int,char __user *,int)) | ||
555 | { | ||
556 | char __user *koptval = optval; | ||
557 | int koptlen = optlen; | ||
558 | |||
559 | switch (optname) { | ||
560 | case MCAST_JOIN_GROUP: | ||
561 | case MCAST_LEAVE_GROUP: | ||
562 | { | ||
563 | struct compat_group_req __user *gr32 = (void *)optval; | ||
564 | struct group_req __user *kgr = | ||
565 | compat_alloc_user_space(sizeof(struct group_req)); | ||
566 | u32 interface; | ||
567 | |||
568 | if (!access_ok(VERIFY_READ, gr32, sizeof(*gr32)) || | ||
569 | !access_ok(VERIFY_WRITE, kgr, sizeof(struct group_req)) || | ||
570 | __get_user(interface, &gr32->gr_interface) || | ||
571 | __put_user(interface, &kgr->gr_interface) || | ||
572 | copy_in_user(&kgr->gr_group, &gr32->gr_group, | ||
573 | sizeof(kgr->gr_group))) | ||
574 | return -EFAULT; | ||
575 | koptval = (char __user *)kgr; | ||
576 | koptlen = sizeof(struct group_req); | ||
577 | break; | ||
578 | } | ||
579 | case MCAST_JOIN_SOURCE_GROUP: | ||
580 | case MCAST_LEAVE_SOURCE_GROUP: | ||
581 | case MCAST_BLOCK_SOURCE: | ||
582 | case MCAST_UNBLOCK_SOURCE: | ||
583 | { | ||
584 | struct compat_group_source_req __user *gsr32 = (void *)optval; | ||
585 | struct group_source_req *kgsr = compat_alloc_user_space( | ||
586 | sizeof(struct group_source_req)); | ||
587 | u32 interface; | ||
588 | |||
589 | if (!access_ok(VERIFY_READ, gsr32, sizeof(*gsr32)) || | ||
590 | !access_ok(VERIFY_WRITE, kgsr, | ||
591 | sizeof(struct group_source_req)) || | ||
592 | __get_user(interface, &gsr32->gsr_interface) || | ||
593 | __put_user(interface, &kgsr->gsr_interface) || | ||
594 | copy_in_user(&kgsr->gsr_group, &gsr32->gsr_group, | ||
595 | sizeof(kgsr->gsr_group)) || | ||
596 | copy_in_user(&kgsr->gsr_source, &gsr32->gsr_source, | ||
597 | sizeof(kgsr->gsr_source))) | ||
598 | return -EFAULT; | ||
599 | koptval = (char __user *)kgsr; | ||
600 | koptlen = sizeof(struct group_source_req); | ||
601 | break; | ||
602 | } | ||
603 | case MCAST_MSFILTER: | ||
604 | { | ||
605 | struct compat_group_filter __user *gf32 = (void *)optval; | ||
606 | struct group_filter *kgf; | ||
607 | u32 interface, fmode, numsrc; | ||
608 | |||
609 | if (!access_ok(VERIFY_READ, gf32, sizeof(*gf32)) || | ||
610 | __get_user(interface, &gf32->gf_interface) || | ||
611 | __get_user(fmode, &gf32->gf_fmode) || | ||
612 | __get_user(numsrc, &gf32->gf_numsrc)) | ||
613 | return -EFAULT; | ||
614 | koptlen = optlen + sizeof(struct group_filter) - | ||
615 | sizeof(struct compat_group_filter); | ||
616 | if (koptlen < GROUP_FILTER_SIZE(numsrc)) | ||
617 | return -EINVAL; | ||
618 | kgf = compat_alloc_user_space(koptlen); | ||
619 | if (!access_ok(VERIFY_WRITE, kgf, koptlen) || | ||
620 | __put_user(interface, &kgf->gf_interface) || | ||
621 | __put_user(fmode, &kgf->gf_fmode) || | ||
622 | __put_user(numsrc, &kgf->gf_numsrc) || | ||
623 | copy_in_user(&kgf->gf_group, &gf32->gf_group, | ||
624 | sizeof(kgf->gf_group)) || | ||
625 | (numsrc && copy_in_user(&kgf->gf_slist, &gf32->gf_slist, | ||
626 | numsrc * sizeof(kgf->gf_slist[0])))) | ||
627 | return -EFAULT; | ||
628 | koptval = (char __user *)kgf; | ||
629 | break; | ||
630 | } | ||
631 | |||
632 | default: | ||
633 | break; | ||
634 | } | ||
635 | return setsockopt(sock, level, optname, koptval, koptlen); | ||
636 | } | ||
637 | |||
638 | EXPORT_SYMBOL(compat_mc_setsockopt); | ||
639 | |||
640 | |||
524 | /* Argument list sizes for compat_sys_socketcall */ | 641 | /* Argument list sizes for compat_sys_socketcall */ |
525 | #define AL(x) ((x) * sizeof(u32)) | 642 | #define AL(x) ((x) * sizeof(u32)) |
526 | static unsigned char nas[18]={AL(0),AL(3),AL(3),AL(3),AL(2),AL(3), | 643 | static unsigned char nas[18]={AL(0),AL(3),AL(3),AL(3),AL(2),AL(3), |
diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index d8adfd4972e..4d8d95404f4 100644 --- a/net/ipv4/ip_sockglue.c +++ b/net/ipv4/ip_sockglue.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #include <linux/mroute.h> | 36 | #include <linux/mroute.h> |
37 | #include <net/route.h> | 37 | #include <net/route.h> |
38 | #include <net/xfrm.h> | 38 | #include <net/xfrm.h> |
39 | #include <net/compat.h> | ||
39 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | 40 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) |
40 | #include <net/transp_v6.h> | 41 | #include <net/transp_v6.h> |
41 | #endif | 42 | #endif |
@@ -923,6 +924,10 @@ int compat_ip_setsockopt(struct sock *sk, int level, int optname, | |||
923 | if (level != SOL_IP) | 924 | if (level != SOL_IP) |
924 | return -ENOPROTOOPT; | 925 | return -ENOPROTOOPT; |
925 | 926 | ||
927 | if (optname >= MCAST_JOIN_GROUP && optname <= MCAST_MSFILTER) | ||
928 | return compat_mc_setsockopt(sk, level, optname, optval, optlen, | ||
929 | ip_setsockopt); | ||
930 | |||
926 | err = do_ip_setsockopt(sk, level, optname, optval, optlen); | 931 | err = do_ip_setsockopt(sk, level, optname, optval, optlen); |
927 | #ifdef CONFIG_NETFILTER | 932 | #ifdef CONFIG_NETFILTER |
928 | /* we need to exclude all possible ENOPROTOOPTs except default case */ | 933 | /* we need to exclude all possible ENOPROTOOPTs except default case */ |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index ac9b8482f70..0298f80681f 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -4925,8 +4925,7 @@ step5: | |||
4925 | tcp_data_snd_check(sk); | 4925 | tcp_data_snd_check(sk); |
4926 | tcp_ack_snd_check(sk); | 4926 | tcp_ack_snd_check(sk); |
4927 | 4927 | ||
4928 | if (tcp_defer_accept_check(sk)) | 4928 | tcp_defer_accept_check(sk); |
4929 | return -1; | ||
4930 | return 0; | 4929 | return 0; |
4931 | 4930 | ||
4932 | csum_error: | 4931 | csum_error: |
diff --git a/net/ipv6/Kconfig b/net/ipv6/Kconfig index b2c9becc02e..42814a2ec9d 100644 --- a/net/ipv6/Kconfig +++ b/net/ipv6/Kconfig | |||
@@ -167,7 +167,7 @@ config IPV6_SIT | |||
167 | Tunneling means encapsulating data of one protocol type within | 167 | Tunneling means encapsulating data of one protocol type within |
168 | another protocol and sending it over a channel that understands the | 168 | another protocol and sending it over a channel that understands the |
169 | encapsulating protocol. This driver implements encapsulation of IPv6 | 169 | encapsulating protocol. This driver implements encapsulation of IPv6 |
170 | into IPv4 packets. This is useful if you want to connect to IPv6 | 170 | into IPv4 packets. This is useful if you want to connect two IPv6 |
171 | networks over an IPv4-only path. | 171 | networks over an IPv4-only path. |
172 | 172 | ||
173 | Saying M here will produce a module called sit.ko. If unsure, say Y. | 173 | Saying M here will produce a module called sit.ko. If unsure, say Y. |
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c index c8c6e33d116..2de3c464fe7 100644 --- a/net/ipv6/ip6mr.c +++ b/net/ipv6/ip6mr.c | |||
@@ -358,7 +358,7 @@ static int pim6_rcv(struct sk_buff *skb) | |||
358 | if (pim->type != ((PIM_VERSION << 4) | PIM_REGISTER) || | 358 | if (pim->type != ((PIM_VERSION << 4) | PIM_REGISTER) || |
359 | (pim->flags & PIM_NULL_REGISTER) || | 359 | (pim->flags & PIM_NULL_REGISTER) || |
360 | (ip_compute_csum((void *)pim, sizeof(*pim)) != 0 && | 360 | (ip_compute_csum((void *)pim, sizeof(*pim)) != 0 && |
361 | (u16)csum_fold(skb_checksum(skb, 0, skb->len, 0)))) | 361 | csum_fold(skb_checksum(skb, 0, skb->len, 0)))) |
362 | goto drop; | 362 | goto drop; |
363 | 363 | ||
364 | /* check if the inner packet is destined to mcast group */ | 364 | /* check if the inner packet is destined to mcast group */ |
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c index 06de9d0e1f6..db6fdc1498a 100644 --- a/net/ipv6/ipv6_sockglue.c +++ b/net/ipv6/ipv6_sockglue.c | |||
@@ -52,6 +52,7 @@ | |||
52 | #include <net/udp.h> | 52 | #include <net/udp.h> |
53 | #include <net/udplite.h> | 53 | #include <net/udplite.h> |
54 | #include <net/xfrm.h> | 54 | #include <net/xfrm.h> |
55 | #include <net/compat.h> | ||
55 | 56 | ||
56 | #include <asm/uaccess.h> | 57 | #include <asm/uaccess.h> |
57 | 58 | ||
@@ -779,6 +780,10 @@ int compat_ipv6_setsockopt(struct sock *sk, int level, int optname, | |||
779 | if (level != SOL_IPV6) | 780 | if (level != SOL_IPV6) |
780 | return -ENOPROTOOPT; | 781 | return -ENOPROTOOPT; |
781 | 782 | ||
783 | if (optname >= MCAST_JOIN_GROUP && optname <= MCAST_MSFILTER) | ||
784 | return compat_mc_setsockopt(sk, level, optname, optval, optlen, | ||
785 | ipv6_setsockopt); | ||
786 | |||
782 | err = do_ipv6_setsockopt(sk, level, optname, optval, optlen); | 787 | err = do_ipv6_setsockopt(sk, level, optname, optval, optlen); |
783 | #ifdef CONFIG_NETFILTER | 788 | #ifdef CONFIG_NETFILTER |
784 | /* we need to exclude all possible ENOPROTOOPTs except default case */ | 789 | /* we need to exclude all possible ENOPROTOOPTs except default case */ |
diff --git a/net/mac80211/Kconfig b/net/mac80211/Kconfig index 520a5180a4f..a24b459dd45 100644 --- a/net/mac80211/Kconfig +++ b/net/mac80211/Kconfig | |||
@@ -73,7 +73,9 @@ config MAC80211_MESH | |||
73 | 73 | ||
74 | config MAC80211_LEDS | 74 | config MAC80211_LEDS |
75 | bool "Enable LED triggers" | 75 | bool "Enable LED triggers" |
76 | depends on MAC80211 && LEDS_TRIGGERS | 76 | depends on MAC80211 |
77 | select NEW_LEDS | ||
78 | select LEDS_TRIGGERS | ||
77 | ---help--- | 79 | ---help--- |
78 | This option enables a few LED triggers for different | 80 | This option enables a few LED triggers for different |
79 | packet receive/transmit events. | 81 | packet receive/transmit events. |
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index 75d748eee0e..e1770f7ba0b 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c | |||
@@ -445,7 +445,7 @@ EXPORT_SYMBOL_GPL(xprt_wake_pending_tasks); | |||
445 | /** | 445 | /** |
446 | * xprt_wait_for_buffer_space - wait for transport output buffer to clear | 446 | * xprt_wait_for_buffer_space - wait for transport output buffer to clear |
447 | * @task: task to be put to sleep | 447 | * @task: task to be put to sleep |
448 | * | 448 | * @action: function pointer to be executed after wait |
449 | */ | 449 | */ |
450 | void xprt_wait_for_buffer_space(struct rpc_task *task, rpc_action action) | 450 | void xprt_wait_for_buffer_space(struct rpc_task *task, rpc_action action) |
451 | { | 451 | { |
diff --git a/net/tipc/msg.h b/net/tipc/msg.h index 6ad070d8770..ad487e8abcc 100644 --- a/net/tipc/msg.h +++ b/net/tipc/msg.h | |||
@@ -70,10 +70,9 @@ static inline void msg_set_bits(struct tipc_msg *m, u32 w, | |||
70 | u32 pos, u32 mask, u32 val) | 70 | u32 pos, u32 mask, u32 val) |
71 | { | 71 | { |
72 | val = (val & mask) << pos; | 72 | val = (val & mask) << pos; |
73 | val = htonl(val); | 73 | mask = mask << pos; |
74 | mask = htonl(mask << pos); | 74 | m->hdr[w] &= ~htonl(mask); |
75 | m->hdr[w] &= ~mask; | 75 | m->hdr[w] |= htonl(val); |
76 | m->hdr[w] |= val; | ||
77 | } | 76 | } |
78 | 77 | ||
79 | /* | 78 | /* |
diff --git a/net/xfrm/xfrm_algo.c b/net/xfrm/xfrm_algo.c index 8aa6440d689..ac765dd9c7f 100644 --- a/net/xfrm/xfrm_algo.c +++ b/net/xfrm/xfrm_algo.c | |||
@@ -129,8 +129,7 @@ static struct xfrm_algo_desc aead_list[] = { | |||
129 | 129 | ||
130 | static struct xfrm_algo_desc aalg_list[] = { | 130 | static struct xfrm_algo_desc aalg_list[] = { |
131 | { | 131 | { |
132 | .name = "hmac(digest_null)", | 132 | .name = "digest_null", |
133 | .compat = "digest_null", | ||
134 | 133 | ||
135 | .uinfo = { | 134 | .uinfo = { |
136 | .auth = { | 135 | .auth = { |
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index 5dcc10b93c8..fac27ce770d 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c | |||
@@ -2112,7 +2112,7 @@ static void xfrm_audit_helper_pktinfo(struct sk_buff *skb, u16 family, | |||
2112 | iph6 = ipv6_hdr(skb); | 2112 | iph6 = ipv6_hdr(skb); |
2113 | audit_log_format(audit_buf, | 2113 | audit_log_format(audit_buf, |
2114 | " src=" NIP6_FMT " dst=" NIP6_FMT | 2114 | " src=" NIP6_FMT " dst=" NIP6_FMT |
2115 | " flowlbl=0x%x%x%x", | 2115 | " flowlbl=0x%x%02x%02x", |
2116 | NIP6(iph6->saddr), | 2116 | NIP6(iph6->saddr), |
2117 | NIP6(iph6->daddr), | 2117 | NIP6(iph6->daddr), |
2118 | iph6->flow_lbl[0] & 0x0f, | 2118 | iph6->flow_lbl[0] & 0x0f, |