forked from Minki/linux
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 <krkumar2@in.ibm.com> Signed-off-by: Sean Hefty <sean.hefty@intel.com>
This commit is contained in:
parent
2e7a742628
commit
255d0c14b3
@ -1762,22 +1762,29 @@ int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr)
|
||||
|
||||
if (!cma_any_addr(addr)) {
|
||||
ret = rdma_translate_ip(addr, &id->route.addr.dev_addr);
|
||||
if (!ret) {
|
||||
mutex_lock(&lock);
|
||||
ret = cma_acquire_dev(id_priv);
|
||||
mutex_unlock(&lock);
|
||||
}
|
||||
if (ret)
|
||||
goto err;
|
||||
goto err1;
|
||||
|
||||
mutex_lock(&lock);
|
||||
ret = cma_acquire_dev(id_priv);
|
||||
mutex_unlock(&lock);
|
||||
if (ret)
|
||||
goto err1;
|
||||
}
|
||||
|
||||
memcpy(&id->route.addr.src_addr, addr, ip_addr_size(addr));
|
||||
ret = cma_get_port(id_priv);
|
||||
if (ret)
|
||||
goto err;
|
||||
goto err2;
|
||||
|
||||
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);
|
||||
return ret;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user