Hi Mark, On 24/06/2021 22.49, Mark Zhang wrote: > On 6/25/2021 2:55 AM, Gerd Rausch wrote: >> Fix a memory leak when "rmda_resolve_route" is called >> more than once on the same "rdma_cm_id". >> >> Signed-off-by: Gerd Rausch <gerd.rausch@xxxxxxxxxx> >> --- >> drivers/infiniband/core/cma.c | 3 ++- >> 1 file changed, 2 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c >> index ab148a696c0c..4a76d5b4163e 100644 >> --- a/drivers/infiniband/core/cma.c >> +++ b/drivers/infiniband/core/cma.c >> @@ -2819,7 +2819,8 @@ static int cma_resolve_ib_route(struct rdma_id_private *id_priv, >> cma_init_resolve_route_work(work, id_priv); >> - route->path_rec = kmalloc(sizeof *route->path_rec, GFP_KERNEL); >> + if (!route->path_rec) >> + route->path_rec = kmalloc(sizeof *route->path_rec, GFP_KERNEL); >> if (!route->path_rec) { >> ret = -ENOMEM; >> goto err1; > > If route->path_rec does exist (meaning this is not the first time called), then it would be freed if cma_query_ib_route() below is failed, is it good? So the caller performs "rdma_resolve_route" which returns an immediate error, but the expectation would be that the cm_id still points to a valid (!= NULL) path record (even though this error indicateed route lookup failed). Which code-part and call-sequence would have such expectation? I can't say I'm in love with this approach either, since the code makes the assumption that "path_rec" (if != NULL) points to a space that was allocated by "kmalloc" before and can be overwritten. It's not permitted to point to something else. But "__rdma_free" makes that assumption anyway, since it unconditionally calls "kfree" on this pointer. So there is precedence. Just my 2ç, Gerd