aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarek Lindner <lindner_marek@yahoo.de>2010-02-19 10:18:11 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2010-03-03 19:43:03 -0500
commitaf71b816cdc623bc7c0b616ededbf3dadaf03156 (patch)
tree14fb2bdd9403954165cd09972484041b8b1ff125
parentda6d6c7ac366ad3189e494cd78376db7a4f40d59 (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.c7
-rw-r--r--drivers/staging/batman-adv/proc.c17
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
128end: 123end:
129 kfree(if_string); 124 kfree(if_string);
130 return count; 125 return count;