Commit 255d0c14 authored by Krishna Kumar's avatar Krishna Kumar Committed by Roland Dreier

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: default avatarKrishna Kumar <krkumar2@in.ibm.com>
Signed-off-by: default avatarSean Hefty <sean.hefty@intel.com>
parent 2e7a7426
...@@ -1762,22 +1762,29 @@ int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr) ...@@ -1762,22 +1762,29 @@ int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr)
if (!cma_any_addr(addr)) { if (!cma_any_addr(addr)) {
ret = rdma_translate_ip(addr, &id->route.addr.dev_addr); ret = rdma_translate_ip(addr, &id->route.addr.dev_addr);
if (!ret) { if (ret)
goto err1;
mutex_lock(&lock); mutex_lock(&lock);
ret = cma_acquire_dev(id_priv); ret = cma_acquire_dev(id_priv);
mutex_unlock(&lock); mutex_unlock(&lock);
}
if (ret) if (ret)
goto err; goto err1;
} }
memcpy(&id->route.addr.src_addr, addr, ip_addr_size(addr)); memcpy(&id->route.addr.src_addr, addr, ip_addr_size(addr));
ret = cma_get_port(id_priv); ret = cma_get_port(id_priv);
if (ret) if (ret)
goto err; goto err2;
return 0; return 0;
err: err2:
if (!cma_any_addr(addr)) {
mutex_lock(&lock);
cma_detach_from_dev(id_priv);
mutex_unlock(&lock);
}
err1:
cma_comp_exch(id_priv, CMA_ADDR_BOUND, CMA_IDLE); cma_comp_exch(id_priv, CMA_ADDR_BOUND, CMA_IDLE);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment