Re: [PATCH v3 06/17] IB/core: Add support for extended query device caps

Haggai Eran
2014-12-17T06:54:44Z

On 16/12/2014 14:33, Yann Droneaud wrote:
> Le jeudi 11 décembre 2014 à 17:04 +0200, Haggai Eran a écrit :
>> static inline int ib_copy_to_udata(struct ib_udata *udata, void *src, size_t len)
>> {
>> - return copy_to_user(udata->outbuf, src, len) ? -EFAULT : 0;
>> + size_t copy_sz;
>> +
>> + copy_sz = min_t(size_t, len, udata->outlen);
>> + return copy_to_user(udata->outbuf, src, copy_sz) ? -EFAULT : 0;
>> }
>
>
> This is not the place to do this: as I'm guessing the purpose of this
> change from the patch in '[PATCH v3 07/17] IB/core: Add flags for on
> demand paging support', you're trying to handle uverbs call from
> a userspace program using a previous, shorter ABI.

Yes, that was my intention.

>
> But that's hidding bug where userspace will get it wrong at passing the
> correct buffer / size for all others uverb calls.
>
> That cannot work that way.
>
> In a previous patchset [1], I've suggested to add a check in
> ib_copy_{from,to}_udata()[2][3] in order to check the input/output
> buffer size to not read/write past userspace provided buffer
> boundaries: in case of mismatch an error would be returned to
> userspace.
>
> With the suggested change here, buffer overflow won't happen,
> but the error is silently ignored, allowing uverb to return a
> partial result, which is likely not expected by userspace as
> it's a bit difficult to handle it gracefully.
>
> So this has to be removed, and a check on userspace response
> buffer must be added to ib_uverbs_ex_query_device() instead.

I agree that we shouldn't silently ignore bugs in userspace, but I'm not
sure the alternative is maintainable. If we have in the future N new
extensions to this verb, will we need to validate the user space given
output buffer is one of the N possible sizes?

Regards,
Haggai