aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2008-04-28 12:44:11 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-04-28 12:44:11 -0400
commit77a50df2b14c8d3ee3c58c21c4a0e0157570df09 (patch)
tree0e324a712e5e768c8353b0b5ba6ddc31095479f0 /net
parent96fffeb4b413a4f8f65bb627d59b7dfc97ea0b39 (diff)
parent358c12953b88c5a06a57c33eb27c753b2e7934d1 (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.c21
-rw-r--r--net/compat.c117
-rw-r--r--net/ipv4/ip_sockglue.c5
-rw-r--r--net/ipv4/tcp_input.c3
-rw-r--r--net/ipv6/Kconfig2
-rw-r--r--net/ipv6/ip6mr.c2
-rw-r--r--net/ipv6/ipv6_sockglue.c5
-rw-r--r--net/mac80211/Kconfig4
-rw-r--r--net/sunrpc/xprt.c2
-rw-r--r--net/tipc/msg.h7
-rw-r--r--net/xfrm/xfrm_algo.c3
-rw-r--r--net/xfrm/xfrm_state.c2
12 files changed, 149 insertions, 24 deletions
diff --git a/net/can/raw.c b/net/can/raw.c
index 201cbfc6b9ec..69877b8e7e9c 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 80013fb69a61..01bf95d0832e 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
527struct compat_group_req {
528 __u32 gr_interface;
529 struct __kernel_sockaddr_storage gr_group
530 __attribute__ ((aligned(4)));
531} __attribute__ ((packed));
532
533struct 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
541struct 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
552int 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
638EXPORT_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))
526static unsigned char nas[18]={AL(0),AL(3),AL(3),AL(3),AL(2),AL(3), 643static 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 d8adfd4972e2..4d8d95404f45 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 ac9b8482f702..0298f80681f2 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
4932csum_error: 4931csum_error:
diff --git a/net/ipv6/Kconfig b/net/ipv6/Kconfig
index b2c9becc02e8..42814a2ec9d7 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 c8c6e33d1163..2de3c464fe75 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 06de9d0e1f6b..db6fdc1498aa 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 520a5180a4f6..a24b459dd45a 100644
--- a/net/mac80211/Kconfig
+++ b/net/mac80211/Kconfig
@@ -73,7 +73,9 @@ config MAC80211_MESH
73 73
74config MAC80211_LEDS 74config 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 75d748eee0eb..e1770f7ba0b3 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 */
450void xprt_wait_for_buffer_space(struct rpc_task *task, rpc_action action) 450void 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 6ad070d87702..ad487e8abcc2 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 8aa6440d689f..ac765dd9c7f5 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
130static struct xfrm_algo_desc aalg_list[] = { 130static 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 5dcc10b93c86..fac27ce770d5 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,