diff options
author | Raphaël Beamonte <raphael.beamonte@gmail.com> | 2015-08-18 23:14:50 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-09-12 18:24:28 -0700 |
commit | 297a1c34da83459e3f7160e2b75127b8935ef688 (patch) | |
tree | e7ed6510b4487f6858cce9c072dbb36b25d14c3b /drivers | |
parent | 7a669e58615c8908cf15222a0ffe1042995cfcd9 (diff) |
staging: wilc1000: replace MALLOC_WILC_BUFFER() macro to avoid possible memory leak
The MALLOC_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@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/staging/wilc1000/wilc_exported_buf.c | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/drivers/staging/wilc1000/wilc_exported_buf.c b/drivers/staging/wilc1000/wilc_exported_buf.c index 44db496fb418..e617b7715600 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 */ @@ -46,11 +39,29 @@ static int __init wilc_module_init(void) /* * 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) + exported_g_tx_buf = kmalloc(LINUX_TX_SIZE, GFP_KERNEL); + if (!exported_g_tx_buf) + return -ENOMEM; + + exported_g_rx_buf = kmalloc(LINUX_RX_SIZE, GFP_KERNEL); + if (!exported_g_rx_buf) + goto free_g_tx_buf; + + exported_g_fw_buf = kmalloc(WILC1000_FW_SIZE, GFP_KERNEL); + if (!exported_g_fw_buf) + goto free_g_rx_buf; return 0; + +free_g_rx_buf: + kfree(exported_g_rx_buf); + exported_g_rx_buf = NULL; + +free_g_tx_buf: + kfree(exported_g_tx_buf); + exported_g_tx_buf = NULL; + + return -ENOMEM; } static void __exit wilc_module_deinit(void) |