[PATCH RESEND] dmaengine: bestcomm: Fix exception handling in bcom_task_alloc()
From: Markus Elfring
Date: Mon Mar 03 2025 - 12:06:48 EST
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