diff options
Diffstat (limited to 'drivers/infiniband/core/ucma.c')
| -rw-r--r-- | drivers/infiniband/core/ucma.c | 19 | 
1 files changed, 7 insertions, 12 deletions
diff --git a/drivers/infiniband/core/ucma.c b/drivers/infiniband/core/ucma.c index 893cb879462..6bf85042289 100644 --- a/drivers/infiniband/core/ucma.c +++ b/drivers/infiniband/core/ucma.c @@ -1002,23 +1002,18 @@ static ssize_t ucma_set_option(struct ucma_file *file, const char __user *inbuf,  	if (IS_ERR(ctx))  		return PTR_ERR(ctx); -	optval = kmalloc(cmd.optlen, GFP_KERNEL); -	if (!optval) { -		ret = -ENOMEM; -		goto out1; -	} - -	if (copy_from_user(optval, (void __user *) (unsigned long) cmd.optval, -			   cmd.optlen)) { -		ret = -EFAULT; -		goto out2; +	optval = memdup_user((void __user *) (unsigned long) cmd.optval, +			     cmd.optlen); +	if (IS_ERR(optval)) { +		ret = PTR_ERR(optval); +		goto out;  	}  	ret = ucma_set_option_level(ctx, cmd.level, cmd.optname, optval,  				    cmd.optlen); -out2:  	kfree(optval); -out1: + +out:  	ucma_put_ctx(ctx);  	return ret;  }  |