-----"Dan Carpenter" <dan.carpenter@xxxxxxxxxx> wrote: ----- >To: "Bernard Metzler" <bmt@xxxxxxxxxxxxxx> >From: "Dan Carpenter" <dan.carpenter@xxxxxxxxxx> >Date: 08/09/2019 12:16PM >Cc: "Doug Ledford" <dledford@xxxxxxxxxx>, "Jason Gunthorpe" ><jgg@xxxxxxxx>, linux-rdma@xxxxxxxxxxxxxxx, >kernel-janitors@xxxxxxxxxxxxxxx >Subject: [EXTERNAL] [PATCH] RDMA/siw: Fix a memory leak in >siw_init_cpulist() > >The error handling code doesn't free siw_cpu_info.tx_valid_cpus[0]. >The >first iteration through the loop is a no-op so this is sort of an off >by >one bug. > >Fixes: bdcf26bf9b3a ("rdma/siw: network and RDMA core interface") >Signed-off-by: Dan Carpenter <dan.carpenter@xxxxxxxxxx> >--- > drivers/infiniband/sw/siw/siw_main.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > >diff --git a/drivers/infiniband/sw/siw/siw_main.c >b/drivers/infiniband/sw/siw/siw_main.c >index d0f140daf659..95ace3967391 100644 >--- a/drivers/infiniband/sw/siw/siw_main.c >+++ b/drivers/infiniband/sw/siw/siw_main.c >@@ -160,9 +160,9 @@ static int siw_init_cpulist(void) > > out_err: > siw_cpu_info.num_nodes = 0; >- while (i) { >+ while (--i >= 0) { > kfree(siw_cpu_info.tx_valid_cpus[i]); >- siw_cpu_info.tx_valid_cpus[i--] = NULL; >+ siw_cpu_info.tx_valid_cpus[i] = NULL; > } > kfree(siw_cpu_info.tx_valid_cpus); > siw_cpu_info.tx_valid_cpus = NULL; >-- >2.20.1 > > Dan, many thanks for catching this one! I suggest you provide an even simpler fix, taking the chance to remove the redundant "siw_cpu_info.tx_valid_cpus[i] = NULL;" line (since the whole structure gets kfree'd a line further down...). This shall be suffcient: - while (i) { + while (--i >= 0) kfree(siw_cpu_info.tx_valid_cpus[i]); - siw_cpu_info.tx_valid_cpus[i--] = NULL; - } + Reviewed-by: Bernard Metzler <bmt@xxxxxxxxxxxxxx>