staging: echo.c: fix memory leakage
PATCH 1/1 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 <[email protected]>
--- drivers/staging/echo/echo.c | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-)
drivers/staging/echo/echo.c +26 -13
@@ -230,6 +230,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)
@@ -239,15 +240,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 ;
@@ -257,7 +265,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 ;
@@ -270,10 +278,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 ; }
Signature · 1 line
1.7.10.4