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 --- Added missing batadv_dec_module_count to batadv_socket_open
debugfs.c | 4 +++- icmp_socket.c | 10 +++++++--- main.c | 4 ++-- main.h | 2 +- 4 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/debugfs.c b/debugfs.c index 391d4fb..63152be 100644 --- a/debugfs.c +++ b/debugfs.c @@ -99,9 +99,11 @@ int batadv_debug_log(struct batadv_priv *bat_priv, const char *fmt, ...)
static int batadv_log_open(struct inode *inode, struct file *file) { + if (!batadv_inc_module_count()) + return -EBUSY; + nonseekable_open(inode, file); file->private_data = inode->i_private; - batadv_inc_module_count(); return 0; }
diff --git a/icmp_socket.c b/icmp_socket.c index bde3cf7..562bf07 100644 --- a/icmp_socket.c +++ b/icmp_socket.c @@ -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 (!batadv_inc_module_count()) + return -EBUSY; + nonseekable_open(inode, file);
socket_client = kmalloc(sizeof(*socket_client), GFP_KERNEL); - - if (!socket_client) + if (!socket_client) { + batadv_dec_module_count(); 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); + batadv_dec_module_count(); 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; }
diff --git a/main.c b/main.c index b4aa470..b4b5b89 100644 --- a/main.c +++ b/main.c @@ -160,9 +160,9 @@ void batadv_mesh_free(struct net_device *soft_iface) atomic_set(&bat_priv->mesh_state, BATADV_MESH_INACTIVE); }
-void batadv_inc_module_count(void) +bool batadv_inc_module_count(void) { - try_module_get(THIS_MODULE); + return try_module_get(THIS_MODULE); }
void batadv_dec_module_count(void) diff --git a/main.h b/main.h index f2227df..ded65b8 100644 --- a/main.h +++ b/main.h @@ -152,7 +152,7 @@ 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); +bool batadv_inc_module_count(void); void batadv_dec_module_count(void); int batadv_is_my_mac(const uint8_t *addr); int batadv_batman_skb_recv(struct sk_buff *skb, struct net_device *dev,