diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c index b707495424719fd3a885a53c98b7ae8eb22a18a1..7f10eade76531017ba709b29aaecd29e39dce282 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c @@ -58,19 +58,21 @@ static int uverbs_response(struct uverbs_attr_bundle *attrs, const void *resp, size_t resp_len) { - u8 __user *cur = attrs->ucore.outbuf + resp_len; - u8 __user *end = attrs->ucore.outbuf + attrs->ucore.outlen; int ret; if (copy_to_user(attrs->ucore.outbuf, resp, min(attrs->ucore.outlen, resp_len))) return -EFAULT; - /* Zero fill any extra memory that user space might have provided */ - for (; cur < end; cur++) { - ret = put_user(0, cur); + if (resp_len < attrs->ucore.outlen) { + /* + * Zero fill any extra memory that user + * space might have provided. + */ + ret = clear_user(attrs->ucore.outbuf + resp_len, + attrs->ucore.outlen - resp_len); if (ret) - return ret; + return -EFAULT; } return 0;