@@ -148,6 +148,7 @@ void cleanup_module()
if(entry->gw_client != NULL) {
gw_client = entry->gw_client;
list_del(&entry->list);
+ kfree(entry);
kfree(gw_client);
}
@@ -267,6 +268,7 @@ static int batgat_ioctl( struct inode *inode, struct file *file, unsigned int cm
if(entry->gw_client) {
gw_client = entry->gw_client;
list_del(&entry->list);
+ kfree(entry);
kfree(gw_client);
}
@@ -653,6 +655,7 @@ static struct gw_client *get_ip_addr(struct sockaddr_in *client_addr)
DBG("use free client from list");
gw_client = entry->gw_client;
list_del(&entry->list);
+ kfree(entry);
break;
}
@@ -129,6 +129,7 @@ void cleanup_module()
if(entry->gw_client != NULL) {
gw_client = entry->gw_client;
list_del(&entry->list);
+ kfree(entry);
kfree(gw_client);
}
@@ -251,6 +252,7 @@ static int batgat_ioctl( struct inode *inode, struct file *file, unsigned int cm
gw_client = entry->gw_client;
list_del(&entry->list);
+ kfree(entry);
kfree(gw_client);
}
@@ -595,6 +597,7 @@ static struct gw_client *get_ip_addr(struct sockaddr_in *client_addr)
printk(KERN_DEBUG "use free client from list");
gw_client = entry->gw_client;
list_del(&entry->list);
+ kfree(entry);
break;
}
list_del will only move the next pointer of the previous entry to the next entry and the do the same with the previous pointer of the next entry. The entry itself will not be touched. We allocated new memory for the list entry so we must free them or otherwise we would only leak memory and run out of it after enough connecting and leaving clients. Signed-off-by: Sven Eckelmann <sven.eckelmann@gmx.de> --- batman/linux/modules/gateway.c | 3 +++ batman/linux/modules/gateway24.c | 3 +++ 2 files changed, 6 insertions(+), 0 deletions(-)