diff options
Diffstat (limited to 'drivers/infiniband/core/cma.c')
| -rw-r--r-- | drivers/infiniband/core/cma.c | 15 | 
1 files changed, 11 insertions, 4 deletions
| diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c index 72f032160c4b..2dec3a02ab9f 100644 --- a/drivers/infiniband/core/cma.c +++ b/drivers/infiniband/core/cma.c @@ -3212,19 +3212,26 @@ int rdma_resolve_addr(struct rdma_cm_id *id, struct sockaddr *src_addr,  	int ret;  	id_priv = container_of(id, struct rdma_id_private, id); +	memcpy(cma_dst_addr(id_priv), dst_addr, rdma_addr_size(dst_addr));  	if (id_priv->state == RDMA_CM_IDLE) {  		ret = cma_bind_addr(id, src_addr, dst_addr); -		if (ret) +		if (ret) { +			memset(cma_dst_addr(id_priv), 0, +			       rdma_addr_size(dst_addr));  			return ret; +		}  	} -	if (cma_family(id_priv) != dst_addr->sa_family) +	if (cma_family(id_priv) != dst_addr->sa_family) { +		memset(cma_dst_addr(id_priv), 0, rdma_addr_size(dst_addr));  		return -EINVAL; +	} -	if (!cma_comp_exch(id_priv, RDMA_CM_ADDR_BOUND, RDMA_CM_ADDR_QUERY)) +	if (!cma_comp_exch(id_priv, RDMA_CM_ADDR_BOUND, RDMA_CM_ADDR_QUERY)) { +		memset(cma_dst_addr(id_priv), 0, rdma_addr_size(dst_addr));  		return -EINVAL; +	} -	memcpy(cma_dst_addr(id_priv), dst_addr, rdma_addr_size(dst_addr));  	if (cma_any_addr(dst_addr)) {  		ret = cma_resolve_loopback(id_priv);  	} else { |