diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-12-03 11:15:36 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-12-03 11:15:36 -0500 |
commit | 8002cedc1adbf51e2d56091534ef7551b88329b4 (patch) | |
tree | 2c65c82b2b5300eac581a0ee794d98f0b61593b6 | |
parent | e87cb5db0dc357473ac71801051954ddd6ff604f (diff) | |
parent | d523a328fb0271e1a763e985a21f2488fd816e7e (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/herbert/net-2.6: (27 commits)
[INET]: Fix inet_diag dead-lock regression
[NETNS]: Fix /proc/net breakage
[TEXTSEARCH]: Do not allow zero length patterns in the textsearch infrastructure
[NETFILTER]: fix forgotten module release in xt_CONNMARK and xt_CONNSECMARK
[NETFILTER]: xt_TCPMSS: remove network triggerable WARN_ON
[DECNET]: dn_nl_deladdr() almost always returns no error
[IPV6]: Restore IPv6 when MTU is big enough
[RXRPC]: Add missing select on CRYPTO
mac80211: rate limit wep decrypt failed messages
rfkill: fix double-mutex-locking
mac80211: drop unencrypted frames if encryption is expected
mac80211: Fix behavior of ieee80211_open and ieee80211_close
ieee80211: fix unaligned access in ieee80211_copy_snap
mac80211: free ifsta->extra_ie and clear IEEE80211_STA_PRIVACY_INVOKED
SCTP: Fix build issues with SCTP AUTH.
SCTP: Fix chunk acceptance when no authenticated chunks were listed.
SCTP: Fix the supported extensions paramter
SCTP: Fix SCTP-AUTH to correctly add HMACS paramter.
SCTP: Fix the number of HB transmissions.
[TCP] illinois: Incorrect beta usage
...
-rw-r--r-- | drivers/net/sungem.c | 11 | ||||
-rw-r--r-- | fs/proc/generic.c | 12 | ||||
-rw-r--r-- | fs/proc/proc_net.c | 86 | ||||
-rw-r--r-- | include/linux/proc_fs.h | 3 | ||||
-rw-r--r-- | include/net/sctp/constants.h | 9 | ||||
-rw-r--r-- | lib/textsearch.c | 8 | ||||
-rw-r--r-- | net/8021q/vlan_dev.c | 3 | ||||
-rw-r--r-- | net/bridge/br.c | 4 | ||||
-rw-r--r-- | net/bridge/br_input.c | 7 | ||||
-rw-r--r-- | net/bridge/netfilter/ebtable_broute.c | 4 | ||||
-rw-r--r-- | net/decnet/dn_dev.c | 4 | ||||
-rw-r--r-- | net/ieee80211/ieee80211_tx.c | 3 | ||||
-rw-r--r-- | net/ipv4/inet_diag.c | 69 | ||||
-rw-r--r-- | net/ipv4/tcp_illinois.c | 2 | ||||
-rw-r--r-- | net/ipv6/addrconf.c | 11 | ||||
-rw-r--r-- | net/mac80211/ieee80211.c | 10 | ||||
-rw-r--r-- | net/mac80211/rx.c | 2 | ||||
-rw-r--r-- | net/mac80211/wep.c | 3 | ||||
-rw-r--r-- | net/netfilter/xt_CONNMARK.c | 10 | ||||
-rw-r--r-- | net/netfilter/xt_CONNSECMARK.c | 10 | ||||
-rw-r--r-- | net/netfilter/xt_TCPMSS.c | 4 | ||||
-rw-r--r-- | net/rfkill/rfkill.c | 14 | ||||
-rw-r--r-- | net/rxrpc/Kconfig | 1 | ||||
-rw-r--r-- | net/sctp/Kconfig | 6 | ||||
-rw-r--r-- | net/sctp/auth.c | 4 | ||||
-rw-r--r-- | net/sctp/sm_make_chunk.c | 25 | ||||
-rw-r--r-- | net/sctp/sm_statefuns.c | 2 | ||||
-rw-r--r-- | net/unix/af_unix.c | 9 | ||||
-rw-r--r-- | net/xfrm/xfrm_policy.c | 1 |
29 files changed, 160 insertions, 177 deletions
diff --git a/drivers/net/sungem.c b/drivers/net/sungem.c index f6fedcc32de1..68872142530b 100644 --- a/drivers/net/sungem.c +++ b/drivers/net/sungem.c | |||
@@ -2281,14 +2281,12 @@ static void gem_reset_task(struct work_struct *work) | |||
2281 | 2281 | ||
2282 | mutex_lock(&gp->pm_mutex); | 2282 | mutex_lock(&gp->pm_mutex); |
2283 | 2283 | ||
2284 | napi_disable(&gp->napi); | 2284 | if (gp->opened) |
2285 | napi_disable(&gp->napi); | ||
2285 | 2286 | ||
2286 | spin_lock_irq(&gp->lock); | 2287 | spin_lock_irq(&gp->lock); |
2287 | spin_lock(&gp->tx_lock); | 2288 | spin_lock(&gp->tx_lock); |
2288 | 2289 | ||
2289 | if (gp->running == 0) | ||
2290 | goto not_running; | ||
2291 | |||
2292 | if (gp->running) { | 2290 | if (gp->running) { |
2293 | netif_stop_queue(gp->dev); | 2291 | netif_stop_queue(gp->dev); |
2294 | 2292 | ||
@@ -2298,13 +2296,14 @@ static void gem_reset_task(struct work_struct *work) | |||
2298 | gem_set_link_modes(gp); | 2296 | gem_set_link_modes(gp); |
2299 | netif_wake_queue(gp->dev); | 2297 | netif_wake_queue(gp->dev); |
2300 | } | 2298 | } |
2301 | not_running: | 2299 | |
2302 | gp->reset_task_pending = 0; | 2300 | gp->reset_task_pending = 0; |
2303 | 2301 | ||
2304 | spin_unlock(&gp->tx_lock); | 2302 | spin_unlock(&gp->tx_lock); |
2305 | spin_unlock_irq(&gp->lock); | 2303 | spin_unlock_irq(&gp->lock); |
2306 | 2304 | ||
2307 | napi_enable(&gp->napi); | 2305 | if (gp->opened) |
2306 | napi_enable(&gp->napi); | ||
2308 | 2307 | ||
2309 | mutex_unlock(&gp->pm_mutex); | 2308 | mutex_unlock(&gp->pm_mutex); |
2310 | } | 2309 | } |
diff --git a/fs/proc/generic.c b/fs/proc/generic.c index 39f3d6519035..5fccfe222a63 100644 --- a/fs/proc/generic.c +++ b/fs/proc/generic.c | |||
@@ -374,9 +374,16 @@ static int proc_delete_dentry(struct dentry * dentry) | |||
374 | return 1; | 374 | return 1; |
375 | } | 375 | } |
376 | 376 | ||
377 | static int proc_revalidate_dentry(struct dentry *dentry, struct nameidata *nd) | ||
378 | { | ||
379 | d_drop(dentry); | ||
380 | return 0; | ||
381 | } | ||
382 | |||
377 | static struct dentry_operations proc_dentry_operations = | 383 | static struct dentry_operations proc_dentry_operations = |
378 | { | 384 | { |
379 | .d_delete = proc_delete_dentry, | 385 | .d_delete = proc_delete_dentry, |
386 | .d_revalidate = proc_revalidate_dentry, | ||
380 | }; | 387 | }; |
381 | 388 | ||
382 | /* | 389 | /* |
@@ -397,8 +404,11 @@ struct dentry *proc_lookup(struct inode * dir, struct dentry *dentry, struct nam | |||
397 | if (de->namelen != dentry->d_name.len) | 404 | if (de->namelen != dentry->d_name.len) |
398 | continue; | 405 | continue; |
399 | if (!memcmp(dentry->d_name.name, de->name, de->namelen)) { | 406 | if (!memcmp(dentry->d_name.name, de->name, de->namelen)) { |
400 | unsigned int ino = de->low_ino; | 407 | unsigned int ino; |
401 | 408 | ||
409 | if (de->shadow_proc) | ||
410 | de = de->shadow_proc(current, de); | ||
411 | ino = de->low_ino; | ||
402 | de_get(de); | 412 | de_get(de); |
403 | spin_unlock(&proc_subdir_lock); | 413 | spin_unlock(&proc_subdir_lock); |
404 | error = -EINVAL; | 414 | error = -EINVAL; |
diff --git a/fs/proc/proc_net.c b/fs/proc/proc_net.c index 131f9c68be5f..0afe21ee0607 100644 --- a/fs/proc/proc_net.c +++ b/fs/proc/proc_net.c | |||
@@ -50,89 +50,14 @@ struct net *get_proc_net(const struct inode *inode) | |||
50 | } | 50 | } |
51 | EXPORT_SYMBOL_GPL(get_proc_net); | 51 | EXPORT_SYMBOL_GPL(get_proc_net); |
52 | 52 | ||
53 | static struct proc_dir_entry *proc_net_shadow; | 53 | static struct proc_dir_entry *shadow_pde; |
54 | 54 | ||
55 | static struct dentry *proc_net_shadow_dentry(struct dentry *parent, | 55 | static struct proc_dir_entry *proc_net_shadow(struct task_struct *task, |
56 | struct proc_dir_entry *de) | 56 | struct proc_dir_entry *de) |
57 | { | 57 | { |
58 | struct dentry *shadow = NULL; | 58 | return task->nsproxy->net_ns->proc_net; |
59 | struct inode *inode; | ||
60 | if (!de) | ||
61 | goto out; | ||
62 | de_get(de); | ||
63 | inode = proc_get_inode(parent->d_inode->i_sb, de->low_ino, de); | ||
64 | if (!inode) | ||
65 | goto out_de_put; | ||
66 | shadow = d_alloc_name(parent, de->name); | ||
67 | if (!shadow) | ||
68 | goto out_iput; | ||
69 | shadow->d_op = parent->d_op; /* proc_dentry_operations */ | ||
70 | d_instantiate(shadow, inode); | ||
71 | out: | ||
72 | return shadow; | ||
73 | out_iput: | ||
74 | iput(inode); | ||
75 | out_de_put: | ||
76 | de_put(de); | ||
77 | goto out; | ||
78 | } | ||
79 | |||
80 | static void *proc_net_follow_link(struct dentry *parent, struct nameidata *nd) | ||
81 | { | ||
82 | struct net *net = current->nsproxy->net_ns; | ||
83 | struct dentry *shadow; | ||
84 | shadow = proc_net_shadow_dentry(parent, net->proc_net); | ||
85 | if (!shadow) | ||
86 | return ERR_PTR(-ENOENT); | ||
87 | |||
88 | dput(nd->dentry); | ||
89 | /* My dentry count is 1 and that should be enough as the | ||
90 | * shadow dentry is thrown away immediately. | ||
91 | */ | ||
92 | nd->dentry = shadow; | ||
93 | return NULL; | ||
94 | } | 59 | } |
95 | 60 | ||
96 | static struct dentry *proc_net_lookup(struct inode *dir, struct dentry *dentry, | ||
97 | struct nameidata *nd) | ||
98 | { | ||
99 | struct net *net = current->nsproxy->net_ns; | ||
100 | struct dentry *shadow; | ||
101 | |||
102 | shadow = proc_net_shadow_dentry(nd->dentry, net->proc_net); | ||
103 | if (!shadow) | ||
104 | return ERR_PTR(-ENOENT); | ||
105 | |||
106 | dput(nd->dentry); | ||
107 | nd->dentry = shadow; | ||
108 | |||
109 | return shadow->d_inode->i_op->lookup(shadow->d_inode, dentry, nd); | ||
110 | } | ||
111 | |||
112 | static int proc_net_setattr(struct dentry *dentry, struct iattr *iattr) | ||
113 | { | ||
114 | struct net *net = current->nsproxy->net_ns; | ||
115 | struct dentry *shadow; | ||
116 | int ret; | ||
117 | |||
118 | shadow = proc_net_shadow_dentry(dentry->d_parent, net->proc_net); | ||
119 | if (!shadow) | ||
120 | return -ENOENT; | ||
121 | ret = shadow->d_inode->i_op->setattr(shadow, iattr); | ||
122 | dput(shadow); | ||
123 | return ret; | ||
124 | } | ||
125 | |||
126 | static const struct file_operations proc_net_dir_operations = { | ||
127 | .read = generic_read_dir, | ||
128 | }; | ||
129 | |||
130 | static struct inode_operations proc_net_dir_inode_operations = { | ||
131 | .follow_link = proc_net_follow_link, | ||
132 | .lookup = proc_net_lookup, | ||
133 | .setattr = proc_net_setattr, | ||
134 | }; | ||
135 | |||
136 | static __net_init int proc_net_ns_init(struct net *net) | 61 | static __net_init int proc_net_ns_init(struct net *net) |
137 | { | 62 | { |
138 | struct proc_dir_entry *root, *netd, *net_statd; | 63 | struct proc_dir_entry *root, *netd, *net_statd; |
@@ -185,9 +110,8 @@ static struct pernet_operations __net_initdata proc_net_ns_ops = { | |||
185 | 110 | ||
186 | int __init proc_net_init(void) | 111 | int __init proc_net_init(void) |
187 | { | 112 | { |
188 | proc_net_shadow = proc_mkdir("net", NULL); | 113 | shadow_pde = proc_mkdir("net", NULL); |
189 | proc_net_shadow->proc_iops = &proc_net_dir_inode_operations; | 114 | shadow_pde->shadow_proc = proc_net_shadow; |
190 | proc_net_shadow->proc_fops = &proc_net_dir_operations; | ||
191 | 115 | ||
192 | return register_pernet_subsys(&proc_net_ns_ops); | 116 | return register_pernet_subsys(&proc_net_ns_ops); |
193 | } | 117 | } |
diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h index 1273c6ec535c..523528d237b0 100644 --- a/include/linux/proc_fs.h +++ b/include/linux/proc_fs.h | |||
@@ -48,6 +48,8 @@ typedef int (read_proc_t)(char *page, char **start, off_t off, | |||
48 | typedef int (write_proc_t)(struct file *file, const char __user *buffer, | 48 | typedef int (write_proc_t)(struct file *file, const char __user *buffer, |
49 | unsigned long count, void *data); | 49 | unsigned long count, void *data); |
50 | typedef int (get_info_t)(char *, char **, off_t, int); | 50 | typedef int (get_info_t)(char *, char **, off_t, int); |
51 | typedef struct proc_dir_entry *(shadow_proc_t)(struct task_struct *task, | ||
52 | struct proc_dir_entry *pde); | ||
51 | 53 | ||
52 | struct proc_dir_entry { | 54 | struct proc_dir_entry { |
53 | unsigned int low_ino; | 55 | unsigned int low_ino; |
@@ -79,6 +81,7 @@ struct proc_dir_entry { | |||
79 | int pde_users; /* number of callers into module in progress */ | 81 | int pde_users; /* number of callers into module in progress */ |
80 | spinlock_t pde_unload_lock; /* proc_fops checks and pde_users bumps */ | 82 | spinlock_t pde_unload_lock; /* proc_fops checks and pde_users bumps */ |
81 | struct completion *pde_unload_completion; | 83 | struct completion *pde_unload_completion; |
84 | shadow_proc_t *shadow_proc; | ||
82 | }; | 85 | }; |
83 | 86 | ||
84 | struct kcore_list { | 87 | struct kcore_list { |
diff --git a/include/net/sctp/constants.h b/include/net/sctp/constants.h index f30b537d6952..05f22a6afbcd 100644 --- a/include/net/sctp/constants.h +++ b/include/net/sctp/constants.h | |||
@@ -441,11 +441,14 @@ enum { | |||
441 | SCTP_AUTH_HMAC_ID_RESERVED_0, | 441 | SCTP_AUTH_HMAC_ID_RESERVED_0, |
442 | SCTP_AUTH_HMAC_ID_SHA1, | 442 | SCTP_AUTH_HMAC_ID_SHA1, |
443 | SCTP_AUTH_HMAC_ID_RESERVED_2, | 443 | SCTP_AUTH_HMAC_ID_RESERVED_2, |
444 | SCTP_AUTH_HMAC_ID_SHA256 | 444 | #if defined (CONFIG_CRYPTO_SHA256) || defined (CONFIG_CRYPTO_SHA256_MODULE) |
445 | SCTP_AUTH_HMAC_ID_SHA256, | ||
446 | #endif | ||
447 | __SCTP_AUTH_HMAC_MAX | ||
445 | }; | 448 | }; |
446 | 449 | ||
447 | #define SCTP_AUTH_HMAC_ID_MAX SCTP_AUTH_HMAC_ID_SHA256 | 450 | #define SCTP_AUTH_HMAC_ID_MAX __SCTP_AUTH_HMAC_MAX - 1 |
448 | #define SCTP_AUTH_NUM_HMACS (SCTP_AUTH_HMAC_ID_SHA256 + 1) | 451 | #define SCTP_AUTH_NUM_HMACS __SCTP_AUTH_HMAC_MAX |
449 | #define SCTP_SHA1_SIG_SIZE 20 | 452 | #define SCTP_SHA1_SIG_SIZE 20 |
450 | #define SCTP_SHA256_SIG_SIZE 32 | 453 | #define SCTP_SHA256_SIG_SIZE 32 |
451 | 454 | ||
diff --git a/lib/textsearch.c b/lib/textsearch.c index 88c98a2ec8d9..be8bda3862f5 100644 --- a/lib/textsearch.c +++ b/lib/textsearch.c | |||
@@ -7,7 +7,7 @@ | |||
7 | * 2 of the License, or (at your option) any later version. | 7 | * 2 of the License, or (at your option) any later version. |
8 | * | 8 | * |
9 | * Authors: Thomas Graf <tgraf@suug.ch> | 9 | * Authors: Thomas Graf <tgraf@suug.ch> |
10 | * Pablo Neira Ayuso <pablo@eurodev.net> | 10 | * Pablo Neira Ayuso <pablo@netfilter.org> |
11 | * | 11 | * |
12 | * ========================================================================== | 12 | * ========================================================================== |
13 | * | 13 | * |
@@ -250,7 +250,8 @@ unsigned int textsearch_find_continuous(struct ts_config *conf, | |||
250 | * the various search algorithms. | 250 | * the various search algorithms. |
251 | * | 251 | * |
252 | * Returns a new textsearch configuration according to the specified | 252 | * Returns a new textsearch configuration according to the specified |
253 | * parameters or a ERR_PTR(). | 253 | * parameters or a ERR_PTR(). If a zero length pattern is passed, this |
254 | * function returns EINVAL. | ||
254 | */ | 255 | */ |
255 | struct ts_config *textsearch_prepare(const char *algo, const void *pattern, | 256 | struct ts_config *textsearch_prepare(const char *algo, const void *pattern, |
256 | unsigned int len, gfp_t gfp_mask, int flags) | 257 | unsigned int len, gfp_t gfp_mask, int flags) |
@@ -259,6 +260,9 @@ struct ts_config *textsearch_prepare(const char *algo, const void *pattern, | |||
259 | struct ts_config *conf; | 260 | struct ts_config *conf; |
260 | struct ts_ops *ops; | 261 | struct ts_ops *ops; |
261 | 262 | ||
263 | if (len == 0) | ||
264 | return ERR_PTR(-EINVAL); | ||
265 | |||
262 | ops = lookup_ts_algo(algo); | 266 | ops = lookup_ts_algo(algo); |
263 | #ifdef CONFIG_KMOD | 267 | #ifdef CONFIG_KMOD |
264 | /* | 268 | /* |
diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c index 7a36878241da..4f99bb86af5c 100644 --- a/net/8021q/vlan_dev.c +++ b/net/8021q/vlan_dev.c | |||
@@ -462,7 +462,8 @@ int vlan_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
462 | * OTHER THINGS LIKE FDDI/TokenRing/802.3 SNAPs... | 462 | * OTHER THINGS LIKE FDDI/TokenRing/802.3 SNAPs... |
463 | */ | 463 | */ |
464 | 464 | ||
465 | if (veth->h_vlan_proto != htons(ETH_P_8021Q)) { | 465 | if (veth->h_vlan_proto != htons(ETH_P_8021Q) || |
466 | VLAN_DEV_INFO(dev)->flags & VLAN_FLAG_REORDER_HDR) { | ||
466 | int orig_headroom = skb_headroom(skb); | 467 | int orig_headroom = skb_headroom(skb); |
467 | unsigned short veth_TCI; | 468 | unsigned short veth_TCI; |
468 | 469 | ||
diff --git a/net/bridge/br.c b/net/bridge/br.c index 93867bb6cc97..a90182873120 100644 --- a/net/bridge/br.c +++ b/net/bridge/br.c | |||
@@ -39,7 +39,7 @@ static int __init br_init(void) | |||
39 | 39 | ||
40 | err = br_fdb_init(); | 40 | err = br_fdb_init(); |
41 | if (err) | 41 | if (err) |
42 | goto err_out1; | 42 | goto err_out; |
43 | 43 | ||
44 | err = br_netfilter_init(); | 44 | err = br_netfilter_init(); |
45 | if (err) | 45 | if (err) |
@@ -65,6 +65,8 @@ err_out3: | |||
65 | err_out2: | 65 | err_out2: |
66 | br_netfilter_fini(); | 66 | br_netfilter_fini(); |
67 | err_out1: | 67 | err_out1: |
68 | br_fdb_fini(); | ||
69 | err_out: | ||
68 | llc_sap_put(br_stp_sap); | 70 | llc_sap_put(br_stp_sap); |
69 | return err; | 71 | return err; |
70 | } | 72 | } |
diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c index 3cedd4eeeed6..0ee79a726d91 100644 --- a/net/bridge/br_input.c +++ b/net/bridge/br_input.c | |||
@@ -122,6 +122,7 @@ static inline int is_link_local(const unsigned char *dest) | |||
122 | struct sk_buff *br_handle_frame(struct net_bridge_port *p, struct sk_buff *skb) | 122 | struct sk_buff *br_handle_frame(struct net_bridge_port *p, struct sk_buff *skb) |
123 | { | 123 | { |
124 | const unsigned char *dest = eth_hdr(skb)->h_dest; | 124 | const unsigned char *dest = eth_hdr(skb)->h_dest; |
125 | int (*rhook)(struct sk_buff *skb); | ||
125 | 126 | ||
126 | if (!is_valid_ether_addr(eth_hdr(skb)->h_source)) | 127 | if (!is_valid_ether_addr(eth_hdr(skb)->h_source)) |
127 | goto drop; | 128 | goto drop; |
@@ -147,9 +148,9 @@ struct sk_buff *br_handle_frame(struct net_bridge_port *p, struct sk_buff *skb) | |||
147 | 148 | ||
148 | switch (p->state) { | 149 | switch (p->state) { |
149 | case BR_STATE_FORWARDING: | 150 | case BR_STATE_FORWARDING: |
150 | 151 | rhook = rcu_dereference(br_should_route_hook); | |
151 | if (br_should_route_hook) { | 152 | if (rhook != NULL) { |
152 | if (br_should_route_hook(skb)) | 153 | if (rhook(skb)) |
153 | return skb; | 154 | return skb; |
154 | dest = eth_hdr(skb)->h_dest; | 155 | dest = eth_hdr(skb)->h_dest; |
155 | } | 156 | } |
diff --git a/net/bridge/netfilter/ebtable_broute.c b/net/bridge/netfilter/ebtable_broute.c index e44519ebf1d2..be6f18681053 100644 --- a/net/bridge/netfilter/ebtable_broute.c +++ b/net/bridge/netfilter/ebtable_broute.c | |||
@@ -70,13 +70,13 @@ static int __init ebtable_broute_init(void) | |||
70 | if (ret < 0) | 70 | if (ret < 0) |
71 | return ret; | 71 | return ret; |
72 | /* see br_input.c */ | 72 | /* see br_input.c */ |
73 | br_should_route_hook = ebt_broute; | 73 | rcu_assign_pointer(br_should_route_hook, ebt_broute); |
74 | return ret; | 74 | return ret; |
75 | } | 75 | } |
76 | 76 | ||
77 | static void __exit ebtable_broute_fini(void) | 77 | static void __exit ebtable_broute_fini(void) |
78 | { | 78 | { |
79 | br_should_route_hook = NULL; | 79 | rcu_assign_pointer(br_should_route_hook, NULL); |
80 | synchronize_net(); | 80 | synchronize_net(); |
81 | ebt_unregister_table(&broute_table); | 81 | ebt_unregister_table(&broute_table); |
82 | } | 82 | } |
diff --git a/net/decnet/dn_dev.c b/net/decnet/dn_dev.c index 66e266fb5908..3bc82dc83b38 100644 --- a/net/decnet/dn_dev.c +++ b/net/decnet/dn_dev.c | |||
@@ -651,16 +651,18 @@ static int dn_nl_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) | |||
651 | struct dn_dev *dn_db; | 651 | struct dn_dev *dn_db; |
652 | struct ifaddrmsg *ifm; | 652 | struct ifaddrmsg *ifm; |
653 | struct dn_ifaddr *ifa, **ifap; | 653 | struct dn_ifaddr *ifa, **ifap; |
654 | int err = -EADDRNOTAVAIL; | 654 | int err; |
655 | 655 | ||
656 | err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, dn_ifa_policy); | 656 | err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFA_MAX, dn_ifa_policy); |
657 | if (err < 0) | 657 | if (err < 0) |
658 | goto errout; | 658 | goto errout; |
659 | 659 | ||
660 | err = -ENODEV; | ||
660 | ifm = nlmsg_data(nlh); | 661 | ifm = nlmsg_data(nlh); |
661 | if ((dn_db = dn_dev_by_index(ifm->ifa_index)) == NULL) | 662 | if ((dn_db = dn_dev_by_index(ifm->ifa_index)) == NULL) |
662 | goto errout; | 663 | goto errout; |
663 | 664 | ||
665 | err = -EADDRNOTAVAIL; | ||
664 | for (ifap = &dn_db->ifa_list; (ifa = *ifap); ifap = &ifa->ifa_next) { | 666 | for (ifap = &dn_db->ifa_list; (ifa = *ifap); ifap = &ifa->ifa_next) { |
665 | if (tb[IFA_LOCAL] && | 667 | if (tb[IFA_LOCAL] && |
666 | nla_memcmp(tb[IFA_LOCAL], &ifa->ifa_local, 2)) | 668 | nla_memcmp(tb[IFA_LOCAL], &ifa->ifa_local, 2)) |
diff --git a/net/ieee80211/ieee80211_tx.c b/net/ieee80211/ieee80211_tx.c index a4c3c51140a3..6d06f1385e28 100644 --- a/net/ieee80211/ieee80211_tx.c +++ b/net/ieee80211/ieee80211_tx.c | |||
@@ -144,7 +144,8 @@ static int ieee80211_copy_snap(u8 * data, u16 h_proto) | |||
144 | snap->oui[1] = oui[1]; | 144 | snap->oui[1] = oui[1]; |
145 | snap->oui[2] = oui[2]; | 145 | snap->oui[2] = oui[2]; |
146 | 146 | ||
147 | *(u16 *) (data + SNAP_SIZE) = htons(h_proto); | 147 | h_proto = htons(h_proto); |
148 | memcpy(data + SNAP_SIZE, &h_proto, sizeof(u16)); | ||
148 | 149 | ||
149 | return SNAP_SIZE + sizeof(u16); | 150 | return SNAP_SIZE + sizeof(u16); |
150 | } | 151 | } |
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c index b0170732b5e9..e468e7a7aac4 100644 --- a/net/ipv4/inet_diag.c +++ b/net/ipv4/inet_diag.c | |||
@@ -51,6 +51,29 @@ static struct sock *idiagnl; | |||
51 | #define INET_DIAG_PUT(skb, attrtype, attrlen) \ | 51 | #define INET_DIAG_PUT(skb, attrtype, attrlen) \ |
52 | RTA_DATA(__RTA_PUT(skb, attrtype, attrlen)) | 52 | RTA_DATA(__RTA_PUT(skb, attrtype, attrlen)) |
53 | 53 | ||
54 | static DEFINE_MUTEX(inet_diag_table_mutex); | ||
55 | |||
56 | static const struct inet_diag_handler *inet_diag_lock_handler(int type) | ||
57 | { | ||
58 | #ifdef CONFIG_KMOD | ||
59 | if (!inet_diag_table[type]) | ||
60 | request_module("net-pf-%d-proto-%d-type-%d", PF_NETLINK, | ||
61 | NETLINK_INET_DIAG, type); | ||
62 | #endif | ||
63 | |||
64 | mutex_lock(&inet_diag_table_mutex); | ||
65 | if (!inet_diag_table[type]) | ||
66 | return ERR_PTR(-ENOENT); | ||
67 | |||
68 | return inet_diag_table[type]; | ||
69 | } | ||
70 | |||
71 | static inline void inet_diag_unlock_handler( | ||
72 | const struct inet_diag_handler *handler) | ||
73 | { | ||
74 | mutex_unlock(&inet_diag_table_mutex); | ||
75 | } | ||
76 | |||
54 | static int inet_csk_diag_fill(struct sock *sk, | 77 | static int inet_csk_diag_fill(struct sock *sk, |
55 | struct sk_buff *skb, | 78 | struct sk_buff *skb, |
56 | int ext, u32 pid, u32 seq, u16 nlmsg_flags, | 79 | int ext, u32 pid, u32 seq, u16 nlmsg_flags, |
@@ -235,9 +258,12 @@ static int inet_diag_get_exact(struct sk_buff *in_skb, | |||
235 | struct inet_hashinfo *hashinfo; | 258 | struct inet_hashinfo *hashinfo; |
236 | const struct inet_diag_handler *handler; | 259 | const struct inet_diag_handler *handler; |
237 | 260 | ||
238 | handler = inet_diag_table[nlh->nlmsg_type]; | 261 | handler = inet_diag_lock_handler(nlh->nlmsg_type); |
239 | BUG_ON(handler == NULL); | 262 | if (!handler) |
263 | return -ENOENT; | ||
264 | |||
240 | hashinfo = handler->idiag_hashinfo; | 265 | hashinfo = handler->idiag_hashinfo; |
266 | err = -EINVAL; | ||
241 | 267 | ||
242 | if (req->idiag_family == AF_INET) { | 268 | if (req->idiag_family == AF_INET) { |
243 | sk = inet_lookup(hashinfo, req->id.idiag_dst[0], | 269 | sk = inet_lookup(hashinfo, req->id.idiag_dst[0], |
@@ -255,11 +281,12 @@ static int inet_diag_get_exact(struct sk_buff *in_skb, | |||
255 | } | 281 | } |
256 | #endif | 282 | #endif |
257 | else { | 283 | else { |
258 | return -EINVAL; | 284 | goto unlock; |
259 | } | 285 | } |
260 | 286 | ||
287 | err = -ENOENT; | ||
261 | if (sk == NULL) | 288 | if (sk == NULL) |
262 | return -ENOENT; | 289 | goto unlock; |
263 | 290 | ||
264 | err = -ESTALE; | 291 | err = -ESTALE; |
265 | if ((req->id.idiag_cookie[0] != INET_DIAG_NOCOOKIE || | 292 | if ((req->id.idiag_cookie[0] != INET_DIAG_NOCOOKIE || |
@@ -296,6 +323,8 @@ out: | |||
296 | else | 323 | else |
297 | sock_put(sk); | 324 | sock_put(sk); |
298 | } | 325 | } |
326 | unlock: | ||
327 | inet_diag_unlock_handler(handler); | ||
299 | return err; | 328 | return err; |
300 | } | 329 | } |
301 | 330 | ||
@@ -678,8 +707,10 @@ static int inet_diag_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
678 | const struct inet_diag_handler *handler; | 707 | const struct inet_diag_handler *handler; |
679 | struct inet_hashinfo *hashinfo; | 708 | struct inet_hashinfo *hashinfo; |
680 | 709 | ||
681 | handler = inet_diag_table[cb->nlh->nlmsg_type]; | 710 | handler = inet_diag_lock_handler(cb->nlh->nlmsg_type); |
682 | BUG_ON(handler == NULL); | 711 | if (!handler) |
712 | goto no_handler; | ||
713 | |||
683 | hashinfo = handler->idiag_hashinfo; | 714 | hashinfo = handler->idiag_hashinfo; |
684 | 715 | ||
685 | s_i = cb->args[1]; | 716 | s_i = cb->args[1]; |
@@ -743,7 +774,7 @@ skip_listen_ht: | |||
743 | } | 774 | } |
744 | 775 | ||
745 | if (!(r->idiag_states & ~(TCPF_LISTEN | TCPF_SYN_RECV))) | 776 | if (!(r->idiag_states & ~(TCPF_LISTEN | TCPF_SYN_RECV))) |
746 | return skb->len; | 777 | goto unlock; |
747 | 778 | ||
748 | for (i = s_i; i < hashinfo->ehash_size; i++) { | 779 | for (i = s_i; i < hashinfo->ehash_size; i++) { |
749 | struct inet_ehash_bucket *head = &hashinfo->ehash[i]; | 780 | struct inet_ehash_bucket *head = &hashinfo->ehash[i]; |
@@ -805,6 +836,9 @@ next_dying: | |||
805 | done: | 836 | done: |
806 | cb->args[1] = i; | 837 | cb->args[1] = i; |
807 | cb->args[2] = num; | 838 | cb->args[2] = num; |
839 | unlock: | ||
840 | inet_diag_unlock_handler(handler); | ||
841 | no_handler: | ||
808 | return skb->len; | 842 | return skb->len; |
809 | } | 843 | } |
810 | 844 | ||
@@ -816,15 +850,6 @@ static int inet_diag_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
816 | nlmsg_len(nlh) < hdrlen) | 850 | nlmsg_len(nlh) < hdrlen) |
817 | return -EINVAL; | 851 | return -EINVAL; |
818 | 852 | ||
819 | #ifdef CONFIG_KMOD | ||
820 | if (inet_diag_table[nlh->nlmsg_type] == NULL) | ||
821 | request_module("net-pf-%d-proto-%d-type-%d", PF_NETLINK, | ||
822 | NETLINK_INET_DIAG, nlh->nlmsg_type); | ||
823 | #endif | ||
824 | |||
825 | if (inet_diag_table[nlh->nlmsg_type] == NULL) | ||
826 | return -ENOENT; | ||
827 | |||
828 | if (nlh->nlmsg_flags & NLM_F_DUMP) { | 853 | if (nlh->nlmsg_flags & NLM_F_DUMP) { |
829 | if (nlmsg_attrlen(nlh, hdrlen)) { | 854 | if (nlmsg_attrlen(nlh, hdrlen)) { |
830 | struct nlattr *attr; | 855 | struct nlattr *attr; |
@@ -853,8 +878,6 @@ static void inet_diag_rcv(struct sk_buff *skb) | |||
853 | mutex_unlock(&inet_diag_mutex); | 878 | mutex_unlock(&inet_diag_mutex); |
854 | } | 879 | } |
855 | 880 | ||
856 | static DEFINE_SPINLOCK(inet_diag_register_lock); | ||
857 | |||
858 | int inet_diag_register(const struct inet_diag_handler *h) | 881 | int inet_diag_register(const struct inet_diag_handler *h) |
859 | { | 882 | { |
860 | const __u16 type = h->idiag_type; | 883 | const __u16 type = h->idiag_type; |
@@ -863,13 +886,13 @@ int inet_diag_register(const struct inet_diag_handler *h) | |||
863 | if (type >= INET_DIAG_GETSOCK_MAX) | 886 | if (type >= INET_DIAG_GETSOCK_MAX) |
864 | goto out; | 887 | goto out; |
865 | 888 | ||
866 | spin_lock(&inet_diag_register_lock); | 889 | mutex_lock(&inet_diag_table_mutex); |
867 | err = -EEXIST; | 890 | err = -EEXIST; |
868 | if (inet_diag_table[type] == NULL) { | 891 | if (inet_diag_table[type] == NULL) { |
869 | inet_diag_table[type] = h; | 892 | inet_diag_table[type] = h; |
870 | err = 0; | 893 | err = 0; |
871 | } | 894 | } |
872 | spin_unlock(&inet_diag_register_lock); | 895 | mutex_unlock(&inet_diag_table_mutex); |
873 | out: | 896 | out: |
874 | return err; | 897 | return err; |
875 | } | 898 | } |
@@ -882,11 +905,9 @@ void inet_diag_unregister(const struct inet_diag_handler *h) | |||
882 | if (type >= INET_DIAG_GETSOCK_MAX) | 905 | if (type >= INET_DIAG_GETSOCK_MAX) |
883 | return; | 906 | return; |
884 | 907 | ||
885 | spin_lock(&inet_diag_register_lock); | 908 | mutex_lock(&inet_diag_table_mutex); |
886 | inet_diag_table[type] = NULL; | 909 | inet_diag_table[type] = NULL; |
887 | spin_unlock(&inet_diag_register_lock); | 910 | mutex_unlock(&inet_diag_table_mutex); |
888 | |||
889 | synchronize_rcu(); | ||
890 | } | 911 | } |
891 | EXPORT_SYMBOL_GPL(inet_diag_unregister); | 912 | EXPORT_SYMBOL_GPL(inet_diag_unregister); |
892 | 913 | ||
diff --git a/net/ipv4/tcp_illinois.c b/net/ipv4/tcp_illinois.c index 64f1cbaf96e8..5aa5f5496d6d 100644 --- a/net/ipv4/tcp_illinois.c +++ b/net/ipv4/tcp_illinois.c | |||
@@ -298,7 +298,7 @@ static u32 tcp_illinois_ssthresh(struct sock *sk) | |||
298 | struct illinois *ca = inet_csk_ca(sk); | 298 | struct illinois *ca = inet_csk_ca(sk); |
299 | 299 | ||
300 | /* Multiplicative decrease */ | 300 | /* Multiplicative decrease */ |
301 | return max((tp->snd_cwnd * ca->beta) >> BETA_SHIFT, 2U); | 301 | return max(tp->snd_cwnd - ((tp->snd_cwnd * ca->beta) >> BETA_SHIFT), 2U); |
302 | } | 302 | } |
303 | 303 | ||
304 | 304 | ||
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 567664eac463..e8c347579da9 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -2293,6 +2293,9 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event, | |||
2293 | break; | 2293 | break; |
2294 | } | 2294 | } |
2295 | 2295 | ||
2296 | if (!idev && dev->mtu >= IPV6_MIN_MTU) | ||
2297 | idev = ipv6_add_dev(dev); | ||
2298 | |||
2296 | if (idev) | 2299 | if (idev) |
2297 | idev->if_flags |= IF_READY; | 2300 | idev->if_flags |= IF_READY; |
2298 | } else { | 2301 | } else { |
@@ -2357,12 +2360,18 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event, | |||
2357 | break; | 2360 | break; |
2358 | 2361 | ||
2359 | case NETDEV_CHANGEMTU: | 2362 | case NETDEV_CHANGEMTU: |
2360 | if ( idev && dev->mtu >= IPV6_MIN_MTU) { | 2363 | if (idev && dev->mtu >= IPV6_MIN_MTU) { |
2361 | rt6_mtu_change(dev, dev->mtu); | 2364 | rt6_mtu_change(dev, dev->mtu); |
2362 | idev->cnf.mtu6 = dev->mtu; | 2365 | idev->cnf.mtu6 = dev->mtu; |
2363 | break; | 2366 | break; |
2364 | } | 2367 | } |
2365 | 2368 | ||
2369 | if (!idev && dev->mtu >= IPV6_MIN_MTU) { | ||
2370 | idev = ipv6_add_dev(dev); | ||
2371 | if (idev) | ||
2372 | break; | ||
2373 | } | ||
2374 | |||
2366 | /* MTU falled under IPV6_MIN_MTU. Stop IPv6 on this interface. */ | 2375 | /* MTU falled under IPV6_MIN_MTU. Stop IPv6 on this interface. */ |
2367 | 2376 | ||
2368 | case NETDEV_DOWN: | 2377 | case NETDEV_DOWN: |
diff --git a/net/mac80211/ieee80211.c b/net/mac80211/ieee80211.c index 59350b8727ec..505af1f067ab 100644 --- a/net/mac80211/ieee80211.c +++ b/net/mac80211/ieee80211.c | |||
@@ -216,6 +216,7 @@ static int ieee80211_open(struct net_device *dev) | |||
216 | res = local->ops->start(local_to_hw(local)); | 216 | res = local->ops->start(local_to_hw(local)); |
217 | if (res) | 217 | if (res) |
218 | return res; | 218 | return res; |
219 | ieee80211_hw_config(local); | ||
219 | } | 220 | } |
220 | 221 | ||
221 | switch (sdata->type) { | 222 | switch (sdata->type) { |
@@ -232,7 +233,6 @@ static int ieee80211_open(struct net_device *dev) | |||
232 | netif_tx_unlock_bh(local->mdev); | 233 | netif_tx_unlock_bh(local->mdev); |
233 | 234 | ||
234 | local->hw.conf.flags |= IEEE80211_CONF_RADIOTAP; | 235 | local->hw.conf.flags |= IEEE80211_CONF_RADIOTAP; |
235 | ieee80211_hw_config(local); | ||
236 | } | 236 | } |
237 | break; | 237 | break; |
238 | case IEEE80211_IF_TYPE_STA: | 238 | case IEEE80211_IF_TYPE_STA: |
@@ -334,8 +334,7 @@ static int ieee80211_stop(struct net_device *dev) | |||
334 | ieee80211_configure_filter(local); | 334 | ieee80211_configure_filter(local); |
335 | netif_tx_unlock_bh(local->mdev); | 335 | netif_tx_unlock_bh(local->mdev); |
336 | 336 | ||
337 | local->hw.conf.flags |= IEEE80211_CONF_RADIOTAP; | 337 | local->hw.conf.flags &= ~IEEE80211_CONF_RADIOTAP; |
338 | ieee80211_hw_config(local); | ||
339 | } | 338 | } |
340 | break; | 339 | break; |
341 | case IEEE80211_IF_TYPE_STA: | 340 | case IEEE80211_IF_TYPE_STA: |
@@ -357,6 +356,11 @@ static int ieee80211_stop(struct net_device *dev) | |||
357 | cancel_delayed_work(&local->scan_work); | 356 | cancel_delayed_work(&local->scan_work); |
358 | } | 357 | } |
359 | flush_workqueue(local->hw.workqueue); | 358 | flush_workqueue(local->hw.workqueue); |
359 | |||
360 | sdata->u.sta.flags &= ~IEEE80211_STA_PRIVACY_INVOKED; | ||
361 | kfree(sdata->u.sta.extra_ie); | ||
362 | sdata->u.sta.extra_ie = NULL; | ||
363 | sdata->u.sta.extra_ie_len = 0; | ||
360 | /* fall through */ | 364 | /* fall through */ |
361 | default: | 365 | default: |
362 | conf.if_id = dev->ifindex; | 366 | conf.if_id = dev->ifindex; |
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 428a9fcf57d6..00f908d9275e 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
@@ -997,7 +997,7 @@ ieee80211_rx_h_drop_unencrypted(struct ieee80211_txrx_data *rx) | |||
997 | if (unlikely(!(rx->fc & IEEE80211_FCTL_PROTECTED) && | 997 | if (unlikely(!(rx->fc & IEEE80211_FCTL_PROTECTED) && |
998 | (rx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA && | 998 | (rx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA && |
999 | (rx->fc & IEEE80211_FCTL_STYPE) != IEEE80211_STYPE_NULLFUNC && | 999 | (rx->fc & IEEE80211_FCTL_STYPE) != IEEE80211_STYPE_NULLFUNC && |
1000 | rx->sdata->drop_unencrypted && | 1000 | (rx->key || rx->sdata->drop_unencrypted) && |
1001 | (rx->sdata->eapol == 0 || !ieee80211_is_eapol(rx->skb)))) { | 1001 | (rx->sdata->eapol == 0 || !ieee80211_is_eapol(rx->skb)))) { |
1002 | if (net_ratelimit()) | 1002 | if (net_ratelimit()) |
1003 | printk(KERN_DEBUG "%s: RX non-WEP frame, but expected " | 1003 | printk(KERN_DEBUG "%s: RX non-WEP frame, but expected " |
diff --git a/net/mac80211/wep.c b/net/mac80211/wep.c index 9bf0e1cc530a..b5f3413403bd 100644 --- a/net/mac80211/wep.c +++ b/net/mac80211/wep.c | |||
@@ -265,7 +265,8 @@ int ieee80211_wep_decrypt(struct ieee80211_local *local, struct sk_buff *skb, | |||
265 | if (ieee80211_wep_decrypt_data(local->wep_rx_tfm, rc4key, klen, | 265 | if (ieee80211_wep_decrypt_data(local->wep_rx_tfm, rc4key, klen, |
266 | skb->data + hdrlen + WEP_IV_LEN, | 266 | skb->data + hdrlen + WEP_IV_LEN, |
267 | len)) { | 267 | len)) { |
268 | printk(KERN_DEBUG "WEP decrypt failed (ICV)\n"); | 268 | if (net_ratelimit()) |
269 | printk(KERN_DEBUG "WEP decrypt failed (ICV)\n"); | ||
269 | ret = -1; | 270 | ret = -1; |
270 | } | 271 | } |
271 | 272 | ||
diff --git a/net/netfilter/xt_CONNMARK.c b/net/netfilter/xt_CONNMARK.c index 856793e8db7a..0621ca7de3b0 100644 --- a/net/netfilter/xt_CONNMARK.c +++ b/net/netfilter/xt_CONNMARK.c | |||
@@ -86,11 +86,6 @@ checkentry(const char *tablename, | |||
86 | { | 86 | { |
87 | const struct xt_connmark_target_info *matchinfo = targinfo; | 87 | const struct xt_connmark_target_info *matchinfo = targinfo; |
88 | 88 | ||
89 | if (nf_ct_l3proto_try_module_get(target->family) < 0) { | ||
90 | printk(KERN_WARNING "can't load conntrack support for " | ||
91 | "proto=%d\n", target->family); | ||
92 | return false; | ||
93 | } | ||
94 | if (matchinfo->mode == XT_CONNMARK_RESTORE) { | 89 | if (matchinfo->mode == XT_CONNMARK_RESTORE) { |
95 | if (strcmp(tablename, "mangle") != 0) { | 90 | if (strcmp(tablename, "mangle") != 0) { |
96 | printk(KERN_WARNING "CONNMARK: restore can only be " | 91 | printk(KERN_WARNING "CONNMARK: restore can only be " |
@@ -103,6 +98,11 @@ checkentry(const char *tablename, | |||
103 | printk(KERN_WARNING "CONNMARK: Only supports 32bit mark\n"); | 98 | printk(KERN_WARNING "CONNMARK: Only supports 32bit mark\n"); |
104 | return false; | 99 | return false; |
105 | } | 100 | } |
101 | if (nf_ct_l3proto_try_module_get(target->family) < 0) { | ||
102 | printk(KERN_WARNING "can't load conntrack support for " | ||
103 | "proto=%d\n", target->family); | ||
104 | return false; | ||
105 | } | ||
106 | return true; | 106 | return true; |
107 | } | 107 | } |
108 | 108 | ||
diff --git a/net/netfilter/xt_CONNSECMARK.c b/net/netfilter/xt_CONNSECMARK.c index 021b5c8d20e2..d8feba9bdb48 100644 --- a/net/netfilter/xt_CONNSECMARK.c +++ b/net/netfilter/xt_CONNSECMARK.c | |||
@@ -90,11 +90,6 @@ static bool checkentry(const char *tablename, const void *entry, | |||
90 | { | 90 | { |
91 | const struct xt_connsecmark_target_info *info = targinfo; | 91 | const struct xt_connsecmark_target_info *info = targinfo; |
92 | 92 | ||
93 | if (nf_ct_l3proto_try_module_get(target->family) < 0) { | ||
94 | printk(KERN_WARNING "can't load conntrack support for " | ||
95 | "proto=%d\n", target->family); | ||
96 | return false; | ||
97 | } | ||
98 | switch (info->mode) { | 93 | switch (info->mode) { |
99 | case CONNSECMARK_SAVE: | 94 | case CONNSECMARK_SAVE: |
100 | case CONNSECMARK_RESTORE: | 95 | case CONNSECMARK_RESTORE: |
@@ -105,6 +100,11 @@ static bool checkentry(const char *tablename, const void *entry, | |||
105 | return false; | 100 | return false; |
106 | } | 101 | } |
107 | 102 | ||
103 | if (nf_ct_l3proto_try_module_get(target->family) < 0) { | ||
104 | printk(KERN_WARNING "can't load conntrack support for " | ||
105 | "proto=%d\n", target->family); | ||
106 | return false; | ||
107 | } | ||
108 | return true; | 108 | return true; |
109 | } | 109 | } |
110 | 110 | ||
diff --git a/net/netfilter/xt_TCPMSS.c b/net/netfilter/xt_TCPMSS.c index 07435a602b11..8e76d1f52fbe 100644 --- a/net/netfilter/xt_TCPMSS.c +++ b/net/netfilter/xt_TCPMSS.c | |||
@@ -174,10 +174,8 @@ xt_tcpmss_target6(struct sk_buff *skb, | |||
174 | 174 | ||
175 | nexthdr = ipv6h->nexthdr; | 175 | nexthdr = ipv6h->nexthdr; |
176 | tcphoff = ipv6_skip_exthdr(skb, sizeof(*ipv6h), &nexthdr); | 176 | tcphoff = ipv6_skip_exthdr(skb, sizeof(*ipv6h), &nexthdr); |
177 | if (tcphoff < 0) { | 177 | if (tcphoff < 0) |
178 | WARN_ON(1); | ||
179 | return NF_DROP; | 178 | return NF_DROP; |
180 | } | ||
181 | ret = tcpmss_mangle_packet(skb, targinfo, tcphoff, | 179 | ret = tcpmss_mangle_packet(skb, targinfo, tcphoff, |
182 | sizeof(*ipv6h) + sizeof(struct tcphdr)); | 180 | sizeof(*ipv6h) + sizeof(struct tcphdr)); |
183 | if (ret < 0) | 181 | if (ret < 0) |
diff --git a/net/rfkill/rfkill.c b/net/rfkill/rfkill.c index 73d60a307129..4469a7be006c 100644 --- a/net/rfkill/rfkill.c +++ b/net/rfkill/rfkill.c | |||
@@ -60,11 +60,7 @@ static void rfkill_led_trigger(struct rfkill *rfkill, | |||
60 | static int rfkill_toggle_radio(struct rfkill *rfkill, | 60 | static int rfkill_toggle_radio(struct rfkill *rfkill, |
61 | enum rfkill_state state) | 61 | enum rfkill_state state) |
62 | { | 62 | { |
63 | int retval; | 63 | int retval = 0; |
64 | |||
65 | retval = mutex_lock_interruptible(&rfkill->mutex); | ||
66 | if (retval) | ||
67 | return retval; | ||
68 | 64 | ||
69 | if (state != rfkill->state) { | 65 | if (state != rfkill->state) { |
70 | retval = rfkill->toggle_radio(rfkill->data, state); | 66 | retval = rfkill->toggle_radio(rfkill->data, state); |
@@ -74,7 +70,6 @@ static int rfkill_toggle_radio(struct rfkill *rfkill, | |||
74 | } | 70 | } |
75 | } | 71 | } |
76 | 72 | ||
77 | mutex_unlock(&rfkill->mutex); | ||
78 | return retval; | 73 | return retval; |
79 | } | 74 | } |
80 | 75 | ||
@@ -158,12 +153,13 @@ static ssize_t rfkill_state_store(struct device *dev, | |||
158 | if (!capable(CAP_NET_ADMIN)) | 153 | if (!capable(CAP_NET_ADMIN)) |
159 | return -EPERM; | 154 | return -EPERM; |
160 | 155 | ||
156 | if (mutex_lock_interruptible(&rfkill->mutex)) | ||
157 | return -ERESTARTSYS; | ||
161 | error = rfkill_toggle_radio(rfkill, | 158 | error = rfkill_toggle_radio(rfkill, |
162 | state ? RFKILL_STATE_ON : RFKILL_STATE_OFF); | 159 | state ? RFKILL_STATE_ON : RFKILL_STATE_OFF); |
163 | if (error) | 160 | mutex_unlock(&rfkill->mutex); |
164 | return error; | ||
165 | 161 | ||
166 | return count; | 162 | return error ? error : count; |
167 | } | 163 | } |
168 | 164 | ||
169 | static ssize_t rfkill_claim_show(struct device *dev, | 165 | static ssize_t rfkill_claim_show(struct device *dev, |
diff --git a/net/rxrpc/Kconfig b/net/rxrpc/Kconfig index e662f1d07664..0d3103c4f11c 100644 --- a/net/rxrpc/Kconfig +++ b/net/rxrpc/Kconfig | |||
@@ -5,6 +5,7 @@ | |||
5 | config AF_RXRPC | 5 | config AF_RXRPC |
6 | tristate "RxRPC session sockets" | 6 | tristate "RxRPC session sockets" |
7 | depends on INET && EXPERIMENTAL | 7 | depends on INET && EXPERIMENTAL |
8 | select CRYPTO | ||
8 | select KEYS | 9 | select KEYS |
9 | help | 10 | help |
10 | Say Y or M here to include support for RxRPC session sockets (just | 11 | Say Y or M here to include support for RxRPC session sockets (just |
diff --git a/net/sctp/Kconfig b/net/sctp/Kconfig index 8210f549c492..5390bc792159 100644 --- a/net/sctp/Kconfig +++ b/net/sctp/Kconfig | |||
@@ -6,9 +6,9 @@ menuconfig IP_SCTP | |||
6 | tristate "The SCTP Protocol (EXPERIMENTAL)" | 6 | tristate "The SCTP Protocol (EXPERIMENTAL)" |
7 | depends on INET && EXPERIMENTAL | 7 | depends on INET && EXPERIMENTAL |
8 | depends on IPV6 || IPV6=n | 8 | depends on IPV6 || IPV6=n |
9 | select CRYPTO if SCTP_HMAC_SHA1 || SCTP_HMAC_MD5 | 9 | select CRYPTO |
10 | select CRYPTO_HMAC if SCTP_HMAC_SHA1 || SCTP_HMAC_MD5 | 10 | select CRYPTO_HMAC |
11 | select CRYPTO_SHA1 if SCTP_HMAC_SHA1 | 11 | select CRYPTO_SHA1 |
12 | select CRYPTO_MD5 if SCTP_HMAC_MD5 | 12 | select CRYPTO_MD5 if SCTP_HMAC_MD5 |
13 | ---help--- | 13 | ---help--- |
14 | Stream Control Transmission Protocol | 14 | Stream Control Transmission Protocol |
diff --git a/net/sctp/auth.c b/net/sctp/auth.c index 6d5fa6bb371b..97e6ebd14500 100644 --- a/net/sctp/auth.c +++ b/net/sctp/auth.c | |||
@@ -54,11 +54,13 @@ static struct sctp_hmac sctp_hmac_list[SCTP_AUTH_NUM_HMACS] = { | |||
54 | /* id 2 is reserved as well */ | 54 | /* id 2 is reserved as well */ |
55 | .hmac_id = SCTP_AUTH_HMAC_ID_RESERVED_2, | 55 | .hmac_id = SCTP_AUTH_HMAC_ID_RESERVED_2, |
56 | }, | 56 | }, |
57 | #if defined (CONFIG_CRYPTO_SHA256) || defined (CONFIG_CRYPTO_SHA256_MODULE) | ||
57 | { | 58 | { |
58 | .hmac_id = SCTP_AUTH_HMAC_ID_SHA256, | 59 | .hmac_id = SCTP_AUTH_HMAC_ID_SHA256, |
59 | .hmac_name="hmac(sha256)", | 60 | .hmac_name="hmac(sha256)", |
60 | .hmac_len = SCTP_SHA256_SIG_SIZE, | 61 | .hmac_len = SCTP_SHA256_SIG_SIZE, |
61 | } | 62 | } |
63 | #endif | ||
62 | }; | 64 | }; |
63 | 65 | ||
64 | 66 | ||
@@ -631,7 +633,7 @@ static int __sctp_auth_cid(sctp_cid_t chunk, struct sctp_chunks_param *param) | |||
631 | int found = 0; | 633 | int found = 0; |
632 | int i; | 634 | int i; |
633 | 635 | ||
634 | if (!param) | 636 | if (!param || param->param_hdr.length == 0) |
635 | return 0; | 637 | return 0; |
636 | 638 | ||
637 | len = ntohs(param->param_hdr.length) - sizeof(sctp_paramhdr_t); | 639 | len = ntohs(param->param_hdr.length) - sizeof(sctp_paramhdr_t); |
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c index 5a9783c38de1..f4876291bb5e 100644 --- a/net/sctp/sm_make_chunk.c +++ b/net/sctp/sm_make_chunk.c | |||
@@ -77,6 +77,8 @@ static int sctp_process_param(struct sctp_association *asoc, | |||
77 | union sctp_params param, | 77 | union sctp_params param, |
78 | const union sctp_addr *peer_addr, | 78 | const union sctp_addr *peer_addr, |
79 | gfp_t gfp); | 79 | gfp_t gfp); |
80 | static void *sctp_addto_param(struct sctp_chunk *chunk, int len, | ||
81 | const void *data); | ||
80 | 82 | ||
81 | /* What was the inbound interface for this chunk? */ | 83 | /* What was the inbound interface for this chunk? */ |
82 | int sctp_chunk_iif(const struct sctp_chunk *chunk) | 84 | int sctp_chunk_iif(const struct sctp_chunk *chunk) |
@@ -207,11 +209,7 @@ struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc, | |||
207 | 209 | ||
208 | chunksize = sizeof(init) + addrs_len + SCTP_SAT_LEN(num_types); | 210 | chunksize = sizeof(init) + addrs_len + SCTP_SAT_LEN(num_types); |
209 | chunksize += sizeof(ecap_param); | 211 | chunksize += sizeof(ecap_param); |
210 | if (sctp_prsctp_enable) { | 212 | |
211 | chunksize += sizeof(prsctp_param); | ||
212 | extensions[num_ext] = SCTP_CID_FWD_TSN; | ||
213 | num_ext += 1; | ||
214 | } | ||
215 | /* ADDIP: Section 4.2.7: | 213 | /* ADDIP: Section 4.2.7: |
216 | * An implementation supporting this extension [ADDIP] MUST list | 214 | * An implementation supporting this extension [ADDIP] MUST list |
217 | * the ASCONF,the ASCONF-ACK, and the AUTH chunks in its INIT and | 215 | * the ASCONF,the ASCONF-ACK, and the AUTH chunks in its INIT and |
@@ -243,7 +241,7 @@ struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc, | |||
243 | if (auth_chunks->length) | 241 | if (auth_chunks->length) |
244 | chunksize += ntohs(auth_chunks->length); | 242 | chunksize += ntohs(auth_chunks->length); |
245 | else | 243 | else |
246 | auth_hmacs = NULL; | 244 | auth_chunks = NULL; |
247 | 245 | ||
248 | extensions[num_ext] = SCTP_CID_AUTH; | 246 | extensions[num_ext] = SCTP_CID_AUTH; |
249 | num_ext += 1; | 247 | num_ext += 1; |
@@ -297,7 +295,7 @@ struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc, | |||
297 | htons(sizeof(sctp_supported_ext_param_t) + num_ext); | 295 | htons(sizeof(sctp_supported_ext_param_t) + num_ext); |
298 | sctp_addto_chunk(retval, sizeof(sctp_supported_ext_param_t), | 296 | sctp_addto_chunk(retval, sizeof(sctp_supported_ext_param_t), |
299 | &ext_param); | 297 | &ext_param); |
300 | sctp_addto_chunk(retval, num_ext, extensions); | 298 | sctp_addto_param(retval, num_ext, extensions); |
301 | } | 299 | } |
302 | 300 | ||
303 | if (sctp_prsctp_enable) | 301 | if (sctp_prsctp_enable) |
@@ -371,20 +369,12 @@ struct sctp_chunk *sctp_make_init_ack(const struct sctp_association *asoc, | |||
371 | if (asoc->peer.ecn_capable) | 369 | if (asoc->peer.ecn_capable) |
372 | chunksize += sizeof(ecap_param); | 370 | chunksize += sizeof(ecap_param); |
373 | 371 | ||
374 | /* Tell peer that we'll do PR-SCTP only if peer advertised. */ | ||
375 | if (asoc->peer.prsctp_capable) { | ||
376 | chunksize += sizeof(prsctp_param); | ||
377 | extensions[num_ext] = SCTP_CID_FWD_TSN; | ||
378 | num_ext += 1; | ||
379 | } | ||
380 | |||
381 | if (sctp_addip_enable) { | 372 | if (sctp_addip_enable) { |
382 | extensions[num_ext] = SCTP_CID_ASCONF; | 373 | extensions[num_ext] = SCTP_CID_ASCONF; |
383 | extensions[num_ext+1] = SCTP_CID_ASCONF_ACK; | 374 | extensions[num_ext+1] = SCTP_CID_ASCONF_ACK; |
384 | num_ext += 2; | 375 | num_ext += 2; |
385 | } | 376 | } |
386 | 377 | ||
387 | chunksize += sizeof(ext_param) + num_ext; | ||
388 | chunksize += sizeof(aiparam); | 378 | chunksize += sizeof(aiparam); |
389 | 379 | ||
390 | if (asoc->peer.auth_capable) { | 380 | if (asoc->peer.auth_capable) { |
@@ -407,6 +397,9 @@ struct sctp_chunk *sctp_make_init_ack(const struct sctp_association *asoc, | |||
407 | num_ext += 1; | 397 | num_ext += 1; |
408 | } | 398 | } |
409 | 399 | ||
400 | if (num_ext) | ||
401 | chunksize += sizeof(sctp_supported_ext_param_t) + num_ext; | ||
402 | |||
410 | /* Now allocate and fill out the chunk. */ | 403 | /* Now allocate and fill out the chunk. */ |
411 | retval = sctp_make_chunk(asoc, SCTP_CID_INIT_ACK, 0, chunksize); | 404 | retval = sctp_make_chunk(asoc, SCTP_CID_INIT_ACK, 0, chunksize); |
412 | if (!retval) | 405 | if (!retval) |
@@ -428,7 +421,7 @@ struct sctp_chunk *sctp_make_init_ack(const struct sctp_association *asoc, | |||
428 | htons(sizeof(sctp_supported_ext_param_t) + num_ext); | 421 | htons(sizeof(sctp_supported_ext_param_t) + num_ext); |
429 | sctp_addto_chunk(retval, sizeof(sctp_supported_ext_param_t), | 422 | sctp_addto_chunk(retval, sizeof(sctp_supported_ext_param_t), |
430 | &ext_param); | 423 | &ext_param); |
431 | sctp_addto_chunk(retval, num_ext, extensions); | 424 | sctp_addto_param(retval, num_ext, extensions); |
432 | } | 425 | } |
433 | if (asoc->peer.prsctp_capable) | 426 | if (asoc->peer.prsctp_capable) |
434 | sctp_addto_chunk(retval, sizeof(prsctp_param), &prsctp_param); | 427 | sctp_addto_chunk(retval, sizeof(prsctp_param), &prsctp_param); |
diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c index b8bbb960723c..5fb84778846d 100644 --- a/net/sctp/sm_statefuns.c +++ b/net/sctp/sm_statefuns.c | |||
@@ -959,7 +959,7 @@ sctp_disposition_t sctp_sf_sendbeat_8_3(const struct sctp_endpoint *ep, | |||
959 | { | 959 | { |
960 | struct sctp_transport *transport = (struct sctp_transport *) arg; | 960 | struct sctp_transport *transport = (struct sctp_transport *) arg; |
961 | 961 | ||
962 | if (asoc->overall_error_count >= asoc->max_retrans) { | 962 | if (asoc->overall_error_count > asoc->max_retrans) { |
963 | sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, | 963 | sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, |
964 | SCTP_ERROR(ETIMEDOUT)); | 964 | SCTP_ERROR(ETIMEDOUT)); |
965 | /* CMD_ASSOC_FAILED calls CMD_DELETE_TCB. */ | 965 | /* CMD_ASSOC_FAILED calls CMD_DELETE_TCB. */ |
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index e835da8fc091..060bba4567d2 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
@@ -1637,8 +1637,15 @@ static int unix_dgram_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1637 | mutex_lock(&u->readlock); | 1637 | mutex_lock(&u->readlock); |
1638 | 1638 | ||
1639 | skb = skb_recv_datagram(sk, flags, noblock, &err); | 1639 | skb = skb_recv_datagram(sk, flags, noblock, &err); |
1640 | if (!skb) | 1640 | if (!skb) { |
1641 | unix_state_lock(sk); | ||
1642 | /* Signal EOF on disconnected non-blocking SEQPACKET socket. */ | ||
1643 | if (sk->sk_type == SOCK_SEQPACKET && err == -EAGAIN && | ||
1644 | (sk->sk_shutdown & RCV_SHUTDOWN)) | ||
1645 | err = 0; | ||
1646 | unix_state_unlock(sk); | ||
1641 | goto out_unlock; | 1647 | goto out_unlock; |
1648 | } | ||
1642 | 1649 | ||
1643 | wake_up_interruptible_sync(&u->peer_wait); | 1650 | wake_up_interruptible_sync(&u->peer_wait); |
1644 | 1651 | ||
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index b702bd8a3893..9a4cf2e45a15 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
@@ -1344,6 +1344,7 @@ restart: | |||
1344 | xfrm_nr += pols[0]->xfrm_nr; | 1344 | xfrm_nr += pols[0]->xfrm_nr; |
1345 | 1345 | ||
1346 | switch (policy->action) { | 1346 | switch (policy->action) { |
1347 | default: | ||
1347 | case XFRM_POLICY_BLOCK: | 1348 | case XFRM_POLICY_BLOCK: |
1348 | /* Prohibit the flow */ | 1349 | /* Prohibit the flow */ |
1349 | err = -EPERM; | 1350 | err = -EPERM; |