diff options
author | Marek Lindner <lindner_marek@yahoo.de> | 2010-02-19 10:18:11 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-03-03 19:43:03 -0500 |
commit | af71b816cdc623bc7c0b616ededbf3dadaf03156 (patch) | |
tree | 14fb2bdd9403954165cd09972484041b8b1ff125 | |
parent | da6d6c7ac366ad3189e494cd78376db7a4f40d59 (diff) |
Staging: batman-adv: fix module initialization
Make sure that batman-adv does not process packets before its
initialization is complete. Some sanity checks added to the receiver
function.
Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
Signed-off-by: Simon Wunderlich <siwu@hrz.tu-chemnitz.de>
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/staging/batman-adv/hard-interface.c | 7 | ||||
-rw-r--r-- | drivers/staging/batman-adv/proc.c | 17 |
2 files changed, 13 insertions, 11 deletions
diff --git a/drivers/staging/batman-adv/hard-interface.c b/drivers/staging/batman-adv/hard-interface.c index 0f94158b2660..befd48839519 100644 --- a/drivers/staging/batman-adv/hard-interface.c +++ b/drivers/staging/batman-adv/hard-interface.c | |||
@@ -432,6 +432,9 @@ int batman_skb_recv(struct sk_buff *skb, struct net_device *dev, | |||
432 | if (!skb) | 432 | if (!skb) |
433 | goto err_out; | 433 | goto err_out; |
434 | 434 | ||
435 | if (atomic_read(&module_state) != MODULE_ACTIVE) | ||
436 | goto err_free; | ||
437 | |||
435 | /* packet should hold at least type and version */ | 438 | /* packet should hold at least type and version */ |
436 | if (unlikely(skb_headlen(skb) < 2)) | 439 | if (unlikely(skb_headlen(skb) < 2)) |
437 | goto err_free; | 440 | goto err_free; |
@@ -445,6 +448,10 @@ int batman_skb_recv(struct sk_buff *skb, struct net_device *dev, | |||
445 | if (!batman_if) | 448 | if (!batman_if) |
446 | goto err_free; | 449 | goto err_free; |
447 | 450 | ||
451 | /* discard frames on not active interfaces */ | ||
452 | if (batman_if->if_active != IF_ACTIVE) | ||
453 | goto err_free; | ||
454 | |||
448 | stats = (struct net_device_stats *)dev_get_stats(skb->dev); | 455 | stats = (struct net_device_stats *)dev_get_stats(skb->dev); |
449 | if (stats) { | 456 | if (stats) { |
450 | stats->rx_packets++; | 457 | stats->rx_packets++; |
diff --git a/drivers/staging/batman-adv/proc.c b/drivers/staging/batman-adv/proc.c index 0eadc6b48d75..7de60e84bc96 100644 --- a/drivers/staging/batman-adv/proc.c +++ b/drivers/staging/batman-adv/proc.c | |||
@@ -63,7 +63,7 @@ static ssize_t proc_interfaces_write(struct file *instance, | |||
63 | size_t count, loff_t *data) | 63 | size_t count, loff_t *data) |
64 | { | 64 | { |
65 | char *if_string, *colon_ptr = NULL, *cr_ptr = NULL; | 65 | char *if_string, *colon_ptr = NULL, *cr_ptr = NULL; |
66 | int not_copied = 0, if_num = 0; | 66 | int not_copied = 0, if_num = 0, add_success; |
67 | struct batman_if *batman_if = NULL; | 67 | struct batman_if *batman_if = NULL; |
68 | 68 | ||
69 | if_string = kmalloc(count, GFP_KERNEL); | 69 | if_string = kmalloc(count, GFP_KERNEL); |
@@ -109,22 +109,17 @@ static ssize_t proc_interfaces_write(struct file *instance, | |||
109 | } | 109 | } |
110 | rcu_read_unlock(); | 110 | rcu_read_unlock(); |
111 | 111 | ||
112 | hardif_add_interface(if_string, if_num); | 112 | add_success = hardif_add_interface(if_string, if_num); |
113 | if (add_success < 0) | ||
114 | goto end; | ||
115 | |||
116 | num_ifs = if_num + 1; | ||
113 | 117 | ||
114 | if ((atomic_read(&module_state) == MODULE_INACTIVE) && | 118 | if ((atomic_read(&module_state) == MODULE_INACTIVE) && |
115 | (hardif_get_active_if_num() > 0)) | 119 | (hardif_get_active_if_num() > 0)) |
116 | activate_module(); | 120 | activate_module(); |
117 | 121 | ||
118 | rcu_read_lock(); | ||
119 | if (list_empty(&if_list)) { | ||
120 | rcu_read_unlock(); | ||
121 | goto end; | ||
122 | } | ||
123 | rcu_read_unlock(); | ||
124 | |||
125 | num_ifs = if_num + 1; | ||
126 | return count; | 122 | return count; |
127 | |||
128 | end: | 123 | end: |
129 | kfree(if_string); | 124 | kfree(if_string); |
130 | return count; | 125 | return count; |