diff options
-rw-r--r-- | drivers/infiniband/core/ucma.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/infiniband/core/ucma.c b/drivers/infiniband/core/ucma.c index 699a46d4c0c5..3f3f7bbc4528 100644 --- a/drivers/infiniband/core/ucma.c +++ b/drivers/infiniband/core/ucma.c | |||
@@ -664,19 +664,23 @@ static ssize_t ucma_resolve_ip(struct ucma_file *file, | |||
664 | int in_len, int out_len) | 664 | int in_len, int out_len) |
665 | { | 665 | { |
666 | struct rdma_ucm_resolve_ip cmd; | 666 | struct rdma_ucm_resolve_ip cmd; |
667 | struct sockaddr *src, *dst; | ||
667 | struct ucma_context *ctx; | 668 | struct ucma_context *ctx; |
668 | int ret; | 669 | int ret; |
669 | 670 | ||
670 | if (copy_from_user(&cmd, inbuf, sizeof(cmd))) | 671 | if (copy_from_user(&cmd, inbuf, sizeof(cmd))) |
671 | return -EFAULT; | 672 | return -EFAULT; |
672 | 673 | ||
674 | src = (struct sockaddr *) &cmd.src_addr; | ||
675 | dst = (struct sockaddr *) &cmd.dst_addr; | ||
676 | if (!rdma_addr_size(src) || !rdma_addr_size(dst)) | ||
677 | return -EINVAL; | ||
678 | |||
673 | ctx = ucma_get_ctx(file, cmd.id); | 679 | ctx = ucma_get_ctx(file, cmd.id); |
674 | if (IS_ERR(ctx)) | 680 | if (IS_ERR(ctx)) |
675 | return PTR_ERR(ctx); | 681 | return PTR_ERR(ctx); |
676 | 682 | ||
677 | ret = rdma_resolve_addr(ctx->cm_id, (struct sockaddr *) &cmd.src_addr, | 683 | ret = rdma_resolve_addr(ctx->cm_id, src, dst, cmd.timeout_ms); |
678 | (struct sockaddr *) &cmd.dst_addr, | ||
679 | cmd.timeout_ms); | ||
680 | ucma_put_ctx(ctx); | 684 | ucma_put_ctx(ctx); |
681 | return ret; | 685 | return ret; |
682 | } | 686 | } |