From 0902468846460274018100bec29e2b236f70ab14 Mon Sep 17 00:00:00 2001 From: Cong Ding Date: Sat, 22 Dec 2012 17:12:26 +0100 Subject: [PATCH] staging: echo.c: fix memory leakage we should check the return value of calling function fir16_create(): a NULL value means the memory allocation fails. this patch also cleans up the error handling in function function oslec_create() Signed-off-by: Cong Ding Signed-off-by: Greg Kroah-Hartman --- drivers/staging/echo/echo.c | 39 ++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/drivers/staging/echo/echo.c b/drivers/staging/echo/echo.c index 14dfd91ab5d2..5882139d49af 100644 --- a/drivers/staging/echo/echo.c +++ b/drivers/staging/echo/echo.c @@ -229,6 +229,7 @@ struct oslec_state *oslec_create(int len, int adaption_mode) { struct oslec_state *ec; int i; + const int16_t *history; ec = kzalloc(sizeof(*ec), GFP_KERNEL); if (!ec) @@ -238,15 +239,22 @@ struct oslec_state *oslec_create(int len, int adaption_mode) ec->log2taps = top_bit(len); ec->curr_pos = ec->taps - 1; - for (i = 0; i < 2; i++) { - ec->fir_taps16[i] = - kcalloc(ec->taps, sizeof(int16_t), GFP_KERNEL); - if (!ec->fir_taps16[i]) - goto error_oom; - } + ec->fir_taps16[0] = + kcalloc(ec->taps, sizeof(int16_t), GFP_KERNEL); + if (!ec->fir_taps16[0]) + goto error_oom_0; + + ec->fir_taps16[1] = + kcalloc(ec->taps, sizeof(int16_t), GFP_KERNEL); + if (!ec->fir_taps16[1]) + goto error_oom_1; - fir16_create(&ec->fir_state, ec->fir_taps16[0], ec->taps); - fir16_create(&ec->fir_state_bg, ec->fir_taps16[1], ec->taps); + history = fir16_create(&ec->fir_state, ec->fir_taps16[0], ec->taps); + if (!history) + goto error_state; + history = fir16_create(&ec->fir_state_bg, ec->fir_taps16[1], ec->taps); + if (!history) + goto error_state_bg; for (i = 0; i < 5; i++) ec->xvtx[i] = ec->yvtx[i] = ec->xvrx[i] = ec->yvrx[i] = 0; @@ -256,7 +264,7 @@ struct oslec_state *oslec_create(int len, int adaption_mode) ec->snapshot = kcalloc(ec->taps, sizeof(int16_t), GFP_KERNEL); if (!ec->snapshot) - goto error_oom; + goto error_snap; ec->cond_met = 0; ec->Pstates = 0; @@ -269,10 +277,15 @@ struct oslec_state *oslec_create(int len, int adaption_mode) return ec; -error_oom: - for (i = 0; i < 2; i++) - kfree(ec->fir_taps16[i]); - +error_snap: + fir16_free(&ec->fir_state_bg); +error_state_bg: + fir16_free(&ec->fir_state); +error_state: + kfree(ec->fir_taps16[1]); +error_oom_1: + kfree(ec->fir_taps16[0]); +error_oom_0: kfree(ec); return NULL; } -- 2.30.2