From: Markus Elfring <elfring@xxxxxxxxxxxxxxxxxxxxx> Date: Sat, 18 Mar 2023 14:55:02 +0100 The label “error” was used to jump to another pointer check despite of the detail in the implementation of the function “bcom_task_alloc” that it was determined already that the corresponding variable contained a null pointer (because of a failed memory allocation). 1. Use more appropriate labels instead. 2. Reorder jump targets at the end. 3. Omit a questionable call of the function “bcom_sram_free” 4. Delete an extra pointer check which became unnecessary with this refactoring. This issue was detected by using the Coccinelle software. Fixes: 2f9ea1bde0d1 ("[POWERPC] bestcomm: core bestcomm support for Freescale MPC5200") Signed-off-by: Markus Elfring <elfring@xxxxxxxxxxxxxxxxxxxxx> --- drivers/dma/bestcomm/bestcomm.c | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/drivers/dma/bestcomm/bestcomm.c b/drivers/dma/bestcomm/bestcomm.c index eabbcfcaa7cb..7d6a92d34871 100644 --- a/drivers/dma/bestcomm/bestcomm.c +++ b/drivers/dma/bestcomm/bestcomm.c @@ -72,7 +72,7 @@ bcom_task_alloc(int bd_count, int bd_size, int priv_size) /* Allocate our structure */ tsk = kzalloc(sizeof(struct bcom_task) + priv_size, GFP_KERNEL); if (!tsk) - goto error; + goto reset_stop; tsk->tasknum = tasknum; if (priv_size) @@ -81,18 +81,18 @@ bcom_task_alloc(int bd_count, int bd_size, int priv_size) /* Get IRQ of that task */ tsk->irq = irq_of_parse_and_map(bcom_eng->ofnode, tsk->tasknum); if (!tsk->irq) - goto error; + goto free_task; /* Init the BDs, if needed */ if (bd_count) { tsk->cookie = kmalloc_array(bd_count, sizeof(void *), GFP_KERNEL); if (!tsk->cookie) - goto error; + goto dispose_mapping; tsk->bd = bcom_sram_alloc(bd_count * bd_size, 4, &tsk->bd_pa); if (!tsk->bd) - goto error; + goto free_cookie; memset_io(tsk->bd, 0x00, bd_count * bd_size); tsk->num_bd = bd_count; @@ -101,15 +101,13 @@ bcom_task_alloc(int bd_count, int bd_size, int priv_size) return tsk; -error: - if (tsk) { - if (tsk->irq) - irq_dispose_mapping(tsk->irq); - bcom_sram_free(tsk->bd); - kfree(tsk->cookie); - kfree(tsk); - } - +free_cookie: + kfree(tsk->cookie); +dispose_mapping: + irq_dispose_mapping(tsk->irq); +free_task: + kfree(tsk); +reset_stop: bcom_eng->tdt[tasknum].stop = 0; return NULL; -- 2.40.0