diff options
author | Linus Torvalds <torvalds@woody.osdl.org> | 2006-11-26 12:42:40 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.osdl.org> | 2006-11-26 12:42:40 -0500 |
commit | 137b529e4df7b9cd6b235654a3f1a8f280e3463d (patch) | |
tree | 30a84ff048ac3e42a767ffa9c6da2b81358baf7a | |
parent | 221a09d5c4cb8384d9be74db60f37a5752675255 (diff) | |
parent | 9abbffee861c6c56fce27e4eda96a10cf0de0f84 (diff) |
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6:
[XFRM] STATE: Fix to respond error to get operation if no matching entry exists.
[NET]: Re-fix of doc-comment in sock.h
[6PACK]: Masking bug in 6pack driver.
[NET]: Fix kfifo_alloc() error check.
[UDP]: Make udp_encap_rcv use pskb_may_pull
[NETFILTER]: H.323 conntrack: fix crash with CONFIG_IP_NF_CT_ACCT
-rw-r--r-- | drivers/net/hamradio/6pack.c | 2 | ||||
-rw-r--r-- | include/net/sock.h | 15 | ||||
-rw-r--r-- | net/dccp/probe.c | 2 | ||||
-rw-r--r-- | net/ipv4/netfilter/ip_conntrack_helper_h323.c | 4 | ||||
-rw-r--r-- | net/ipv4/tcp_probe.c | 2 | ||||
-rw-r--r-- | net/ipv4/udp.c | 19 | ||||
-rw-r--r-- | net/xfrm/xfrm_user.c | 1 |
7 files changed, 32 insertions, 13 deletions
diff --git a/drivers/net/hamradio/6pack.c b/drivers/net/hamradio/6pack.c index 86b3bb9bec2d..92420f007b97 100644 --- a/drivers/net/hamradio/6pack.c +++ b/drivers/net/hamradio/6pack.c | |||
@@ -914,7 +914,7 @@ static void decode_prio_command(struct sixpack *sp, unsigned char cmd) | |||
914 | printk(KERN_DEBUG "6pack: protocol violation\n"); | 914 | printk(KERN_DEBUG "6pack: protocol violation\n"); |
915 | else | 915 | else |
916 | sp->status = 0; | 916 | sp->status = 0; |
917 | cmd &= !SIXP_RX_DCD_MASK; | 917 | cmd &= ~SIXP_RX_DCD_MASK; |
918 | } | 918 | } |
919 | sp->status = cmd & SIXP_PRIO_DATA_MASK; | 919 | sp->status = cmd & SIXP_PRIO_DATA_MASK; |
920 | } else { /* output watchdog char if idle */ | 920 | } else { /* output watchdog char if idle */ |
diff --git a/include/net/sock.h b/include/net/sock.h index ac286a353032..9cdbae2a53a3 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
@@ -883,18 +883,23 @@ static inline int sk_filter(struct sock *sk, struct sk_buff *skb) | |||
883 | } | 883 | } |
884 | 884 | ||
885 | /** | 885 | /** |
886 | * sk_filter_release: Release a socket filter | 886 | * sk_filter_rcu_free: Free a socket filter |
887 | * @rcu: rcu_head that contains the sk_filter info to remove | 887 | * @rcu: rcu_head that contains the sk_filter to free |
888 | * | ||
889 | * Remove a filter from a socket and release its resources. | ||
890 | */ | 888 | */ |
891 | |||
892 | static inline void sk_filter_rcu_free(struct rcu_head *rcu) | 889 | static inline void sk_filter_rcu_free(struct rcu_head *rcu) |
893 | { | 890 | { |
894 | struct sk_filter *fp = container_of(rcu, struct sk_filter, rcu); | 891 | struct sk_filter *fp = container_of(rcu, struct sk_filter, rcu); |
895 | kfree(fp); | 892 | kfree(fp); |
896 | } | 893 | } |
897 | 894 | ||
895 | /** | ||
896 | * sk_filter_release: Release a socket filter | ||
897 | * @sk: socket | ||
898 | * @fp: filter to remove | ||
899 | * | ||
900 | * Remove a filter from a socket and release its resources. | ||
901 | */ | ||
902 | |||
898 | static inline void sk_filter_release(struct sock *sk, struct sk_filter *fp) | 903 | static inline void sk_filter_release(struct sock *sk, struct sk_filter *fp) |
899 | { | 904 | { |
900 | unsigned int size = sk_filter_len(fp); | 905 | unsigned int size = sk_filter_len(fp); |
diff --git a/net/dccp/probe.c b/net/dccp/probe.c index 146496fce2e2..fded1493c1dc 100644 --- a/net/dccp/probe.c +++ b/net/dccp/probe.c | |||
@@ -160,6 +160,8 @@ static __init int dccpprobe_init(void) | |||
160 | init_waitqueue_head(&dccpw.wait); | 160 | init_waitqueue_head(&dccpw.wait); |
161 | spin_lock_init(&dccpw.lock); | 161 | spin_lock_init(&dccpw.lock); |
162 | dccpw.fifo = kfifo_alloc(bufsize, GFP_KERNEL, &dccpw.lock); | 162 | dccpw.fifo = kfifo_alloc(bufsize, GFP_KERNEL, &dccpw.lock); |
163 | if (IS_ERR(dccpw.fifo)) | ||
164 | return PTR_ERR(dccpw.fifo); | ||
163 | 165 | ||
164 | if (!proc_net_fops_create(procname, S_IRUSR, &dccpprobe_fops)) | 166 | if (!proc_net_fops_create(procname, S_IRUSR, &dccpprobe_fops)) |
165 | goto err0; | 167 | goto err0; |
diff --git a/net/ipv4/netfilter/ip_conntrack_helper_h323.c b/net/ipv4/netfilter/ip_conntrack_helper_h323.c index 7b7441202bfd..6cb9070cd0bc 100644 --- a/net/ipv4/netfilter/ip_conntrack_helper_h323.c +++ b/net/ipv4/netfilter/ip_conntrack_helper_h323.c | |||
@@ -1417,7 +1417,7 @@ static int process_rcf(struct sk_buff **pskb, struct ip_conntrack *ct, | |||
1417 | DEBUGP | 1417 | DEBUGP |
1418 | ("ip_ct_ras: set RAS connection timeout to %u seconds\n", | 1418 | ("ip_ct_ras: set RAS connection timeout to %u seconds\n", |
1419 | info->timeout); | 1419 | info->timeout); |
1420 | ip_ct_refresh_acct(ct, ctinfo, NULL, info->timeout * HZ); | 1420 | ip_ct_refresh(ct, *pskb, info->timeout * HZ); |
1421 | 1421 | ||
1422 | /* Set expect timeout */ | 1422 | /* Set expect timeout */ |
1423 | read_lock_bh(&ip_conntrack_lock); | 1423 | read_lock_bh(&ip_conntrack_lock); |
@@ -1465,7 +1465,7 @@ static int process_urq(struct sk_buff **pskb, struct ip_conntrack *ct, | |||
1465 | info->sig_port[!dir] = 0; | 1465 | info->sig_port[!dir] = 0; |
1466 | 1466 | ||
1467 | /* Give it 30 seconds for UCF or URJ */ | 1467 | /* Give it 30 seconds for UCF or URJ */ |
1468 | ip_ct_refresh_acct(ct, ctinfo, NULL, 30 * HZ); | 1468 | ip_ct_refresh(ct, *pskb, 30 * HZ); |
1469 | 1469 | ||
1470 | return 0; | 1470 | return 0; |
1471 | } | 1471 | } |
diff --git a/net/ipv4/tcp_probe.c b/net/ipv4/tcp_probe.c index 4be336f17883..f230eeecf092 100644 --- a/net/ipv4/tcp_probe.c +++ b/net/ipv4/tcp_probe.c | |||
@@ -156,6 +156,8 @@ static __init int tcpprobe_init(void) | |||
156 | init_waitqueue_head(&tcpw.wait); | 156 | init_waitqueue_head(&tcpw.wait); |
157 | spin_lock_init(&tcpw.lock); | 157 | spin_lock_init(&tcpw.lock); |
158 | tcpw.fifo = kfifo_alloc(bufsize, GFP_KERNEL, &tcpw.lock); | 158 | tcpw.fifo = kfifo_alloc(bufsize, GFP_KERNEL, &tcpw.lock); |
159 | if (IS_ERR(tcpw.fifo)) | ||
160 | return PTR_ERR(tcpw.fifo); | ||
159 | 161 | ||
160 | if (!proc_net_fops_create(procname, S_IRUSR, &tcpprobe_fops)) | 162 | if (!proc_net_fops_create(procname, S_IRUSR, &tcpprobe_fops)) |
161 | goto err0; | 163 | goto err0; |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 865d75214a9a..9e1bd374875e 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
@@ -928,23 +928,32 @@ static int udp_encap_rcv(struct sock * sk, struct sk_buff *skb) | |||
928 | return 1; | 928 | return 1; |
929 | #else | 929 | #else |
930 | struct udp_sock *up = udp_sk(sk); | 930 | struct udp_sock *up = udp_sk(sk); |
931 | struct udphdr *uh = skb->h.uh; | 931 | struct udphdr *uh; |
932 | struct iphdr *iph; | 932 | struct iphdr *iph; |
933 | int iphlen, len; | 933 | int iphlen, len; |
934 | 934 | ||
935 | __u8 *udpdata = (__u8 *)uh + sizeof(struct udphdr); | 935 | __u8 *udpdata; |
936 | __be32 *udpdata32 = (__be32 *)udpdata; | 936 | __be32 *udpdata32; |
937 | __u16 encap_type = up->encap_type; | 937 | __u16 encap_type = up->encap_type; |
938 | 938 | ||
939 | /* if we're overly short, let UDP handle it */ | 939 | /* if we're overly short, let UDP handle it */ |
940 | if (udpdata > skb->tail) | 940 | len = skb->len - sizeof(struct udphdr); |
941 | if (len <= 0) | ||
941 | return 1; | 942 | return 1; |
942 | 943 | ||
943 | /* if this is not encapsulated socket, then just return now */ | 944 | /* if this is not encapsulated socket, then just return now */ |
944 | if (!encap_type) | 945 | if (!encap_type) |
945 | return 1; | 946 | return 1; |
946 | 947 | ||
947 | len = skb->tail - udpdata; | 948 | /* If this is a paged skb, make sure we pull up |
949 | * whatever data we need to look at. */ | ||
950 | if (!pskb_may_pull(skb, sizeof(struct udphdr) + min(len, 8))) | ||
951 | return 1; | ||
952 | |||
953 | /* Now we can get the pointers */ | ||
954 | uh = skb->h.uh; | ||
955 | udpdata = (__u8 *)uh + sizeof(struct udphdr); | ||
956 | udpdata32 = (__be32 *)udpdata; | ||
948 | 957 | ||
949 | switch (encap_type) { | 958 | switch (encap_type) { |
950 | default: | 959 | default: |
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index c4cde57d9216..2ee14f8a1908 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
@@ -495,6 +495,7 @@ static struct xfrm_state *xfrm_user_state_lookup(struct xfrm_usersa_id *p, | |||
495 | goto out; | 495 | goto out; |
496 | } | 496 | } |
497 | 497 | ||
498 | err = -ESRCH; | ||
498 | x = xfrm_state_lookup_byaddr(&p->daddr, saddr, p->proto, | 499 | x = xfrm_state_lookup_byaddr(&p->daddr, saddr, p->proto, |
499 | p->family); | 500 | p->family); |
500 | } | 501 | } |