The MACRO_WILC_BUFFER() macro was using a return statement, and didn't take care of possible memory leaks and subsequent bugs when it was failing after succeeding some allocations. This patch corrects this behavior. Signed-off-by: Raphaël Beamonte <raphael.beamonte@xxxxxxxxx> --- drivers/staging/wilc1000/wilc_exported_buf.c | 39 +++++++++++++++++++++------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/drivers/staging/wilc1000/wilc_exported_buf.c b/drivers/staging/wilc1000/wilc_exported_buf.c index bf392fb..c3aff9a 100644 --- a/drivers/staging/wilc1000/wilc_exported_buf.c +++ b/drivers/staging/wilc1000/wilc_exported_buf.c @@ -8,13 +8,6 @@ #define LINUX_TX_SIZE (64 * 1024) #define WILC1000_FW_SIZE (4 * 1024) -#define MALLOC_WILC_BUFFER(name, size) \ - exported_ ## name = kmalloc(size, GFP_KERNEL); \ - if (!exported_ ## name) { \ - printk("fail to alloc: %s memory\n", exported_ ## name); \ - return -ENOBUFS; \ - } - /* * Add necessary buffer pointers */ @@ -40,17 +33,43 @@ void *get_fw_buffer(void) } EXPORT_SYMBOL(get_fw_buffer); +static inline int kmalloc_wilc_buffer(void *buf, int size) +{ + buf = kmalloc(size, GFP_KERNEL); + if (!buf) { + printk("fail to alloc memory\n"); + return -ENOBUFS; + } + return 0; +} + static int __init wilc_module_init(void) { printk("wilc_module_init\n"); /* * alloc necessary memory */ - MALLOC_WILC_BUFFER(g_tx_buf, LINUX_TX_SIZE) - MALLOC_WILC_BUFFER(g_rx_buf, LINUX_RX_SIZE) - MALLOC_WILC_BUFFER(g_fw_buf, WILC1000_FW_SIZE) + if (kmalloc_wilc_buffer(exported_g_tx_buf, LINUX_TX_SIZE)) + goto error_g_tx_buf; + + if (kmalloc_wilc_buffer(exported_g_rx_buf, LINUX_RX_SIZE)) + goto error_g_rx_buf; + + if (kmalloc_wilc_buffer(exported_g_fw_buf, WILC1000_FW_SIZE)) + goto error_g_fw_buf; return 0; + +error_g_fw_buf: + kfree(exported_g_rx_buf); + exported_g_rx_buf = NULL; + +error_g_rx_buf: + kfree(exported_g_tx_buf); + exported_g_tx_buf = NULL; + +error_g_tx_buf: + return -ENOBUFS; } static void __exit wilc_module_deinit(void) -- 2.1.4 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel