batman-adv: Check return value of try_module_get
authorSven Eckelmann <sven@narfation.org>
Mon, 20 Aug 2012 21:37:26 +0000 (23:37 +0200)
committerAntonio Quartulli <ordex@autistici.org>
Mon, 29 Oct 2012 08:42:36 +0000 (09:42 +0100)
New operations should not be started when they need an increased module
reference counter and try_module_get failed.

This patch addresses Coverity #712284: Unchecked return value

Signed-off-by: Sven Eckelmann <sven@narfation.org>
Signed-off-by: Antonio Quartulli <ordex@autistici.org>
net/batman-adv/debugfs.c
net/batman-adv/icmp_socket.c
net/batman-adv/main.c
net/batman-adv/main.h

index 391d4fb2026f9acf7ce1b1f85a0c2f5366152c35..bd032bc4e262d19db92a8a359a092af2726af400 100644 (file)
@@ -99,15 +99,17 @@ int batadv_debug_log(struct batadv_priv *bat_priv, const char *fmt, ...)
 
 static int batadv_log_open(struct inode *inode, struct file *file)
 {
+       if (!try_module_get(THIS_MODULE))
+               return -EBUSY;
+
        nonseekable_open(inode, file);
        file->private_data = inode->i_private;
-       batadv_inc_module_count();
        return 0;
 }
 
 static int batadv_log_release(struct inode *inode, struct file *file)
 {
-       batadv_dec_module_count();
+       module_put(THIS_MODULE);
        return 0;
 }
 
index bde3cf74750796142d4a74e1db2be87516152a1c..5874c0e84846a16cb37e55c605ba50c24cd98bd1 100644 (file)
@@ -42,12 +42,16 @@ static int batadv_socket_open(struct inode *inode, struct file *file)
        unsigned int i;
        struct batadv_socket_client *socket_client;
 
+       if (!try_module_get(THIS_MODULE))
+               return -EBUSY;
+
        nonseekable_open(inode, file);
 
        socket_client = kmalloc(sizeof(*socket_client), GFP_KERNEL);
-
-       if (!socket_client)
+       if (!socket_client) {
+               module_put(THIS_MODULE);
                return -ENOMEM;
+       }
 
        for (i = 0; i < ARRAY_SIZE(batadv_socket_client_hash); i++) {
                if (!batadv_socket_client_hash[i]) {
@@ -59,6 +63,7 @@ static int batadv_socket_open(struct inode *inode, struct file *file)
        if (i == ARRAY_SIZE(batadv_socket_client_hash)) {
                pr_err("Error - can't add another packet client: maximum number of clients reached\n");
                kfree(socket_client);
+               module_put(THIS_MODULE);
                return -EXFULL;
        }
 
@@ -71,7 +76,6 @@ static int batadv_socket_open(struct inode *inode, struct file *file)
 
        file->private_data = socket_client;
 
-       batadv_inc_module_count();
        return 0;
 }
 
@@ -96,7 +100,7 @@ static int batadv_socket_release(struct inode *inode, struct file *file)
        spin_unlock_bh(&socket_client->lock);
 
        kfree(socket_client);
-       batadv_dec_module_count();
+       module_put(THIS_MODULE);
 
        return 0;
 }
index a4a337d9af9c6eeb44c2742fcda026542c903cbe..f9bcfa17f50fec51b310ede273dada0f384d7df2 100644 (file)
@@ -160,16 +160,6 @@ void batadv_mesh_free(struct net_device *soft_iface)
        atomic_set(&bat_priv->mesh_state, BATADV_MESH_INACTIVE);
 }
 
-void batadv_inc_module_count(void)
-{
-       try_module_get(THIS_MODULE);
-}
-
-void batadv_dec_module_count(void)
-{
-       module_put(THIS_MODULE);
-}
-
 int batadv_is_my_mac(const uint8_t *addr)
 {
        const struct batadv_hard_iface *hard_iface;
index 5c0be5b13415d23e3a1c15305ab0c2dbe2fad440..9b94f05f8a179c688c945aacb485e7349b307fb1 100644 (file)
@@ -150,8 +150,6 @@ extern struct workqueue_struct *batadv_event_workqueue;
 
 int batadv_mesh_init(struct net_device *soft_iface);
 void batadv_mesh_free(struct net_device *soft_iface);
-void batadv_inc_module_count(void);
-void batadv_dec_module_count(void);
 int batadv_is_my_mac(const uint8_t *addr);
 struct batadv_hard_iface *
 batadv_seq_print_text_primary_if_get(struct seq_file *seq);