Skip to content

Commit 255d0c1

Browse files
krkumarRoland Dreier
authored and
Roland Dreier
committed
RDMA/cma: rdma_bind_addr() leaks a cma_dev reference count
rdma_bind_addr() leaks a cma_dev reference count in failure case. Signed-off-by: Krishna Kumar <[email protected]> Signed-off-by: Sean Hefty <[email protected]>
1 parent 2e7a742 commit 255d0c1

File tree

1 file changed

+15
-8
lines changed
  • drivers/infiniband/core

1 file changed

+15
-8
lines changed

drivers/infiniband/core/cma.c

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1762,22 +1762,29 @@ int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr)
17621762

17631763
if (!cma_any_addr(addr)) {
17641764
ret = rdma_translate_ip(addr, &id->route.addr.dev_addr);
1765-
if (!ret) {
1766-
mutex_lock(&lock);
1767-
ret = cma_acquire_dev(id_priv);
1768-
mutex_unlock(&lock);
1769-
}
17701765
if (ret)
1771-
goto err;
1766+
goto err1;
1767+
1768+
mutex_lock(&lock);
1769+
ret = cma_acquire_dev(id_priv);
1770+
mutex_unlock(&lock);
1771+
if (ret)
1772+
goto err1;
17721773
}
17731774

17741775
memcpy(&id->route.addr.src_addr, addr, ip_addr_size(addr));
17751776
ret = cma_get_port(id_priv);
17761777
if (ret)
1777-
goto err;
1778+
goto err2;
17781779

17791780
return 0;
1780-
err:
1781+
err2:
1782+
if (!cma_any_addr(addr)) {
1783+
mutex_lock(&lock);
1784+
cma_detach_from_dev(id_priv);
1785+
mutex_unlock(&lock);
1786+
}
1787+
err1:
17811788
cma_comp_exch(id_priv, CMA_ADDR_BOUND, CMA_IDLE);
17821789
return ret;
17831790
}

0 commit comments

Comments
 (0)