Re: [PATCH] staging: lustre: return error if copy_to_user fails

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello!

On May 14, 2015, at 5:52 AM, Gujulan Elango, Hari Prasath (H.) wrote:

> On Thu, May 14, 2015 at 12:47:19PM +0300, Dan Carpenter wrote:
>> On Thu, May 14, 2015 at 09:22:01AM +0000, Gujulan Elango, Hari Prasath (H.) wrote:
>>> The return value of copy_to_user() isn't checked for failure.Hence
>>> return -EFAULT if it fails.
>>> 
>>> Signed-off-by: Hari Prasath Gujulan Elango <hgujulan@xxxxxxxxxxx>
>>> ---
>>> drivers/staging/lustre/lustre/lov/lov_pack.c | 7 ++++---
>>> 1 file changed, 4 insertions(+), 3 deletions(-)
>>> 
>>> diff --git a/drivers/staging/lustre/lustre/lov/lov_pack.c b/drivers/staging/lustre/lustre/lov/lov_pack.c
>>> index 5356d53..aa3d6de 100644
>>> --- a/drivers/staging/lustre/lustre/lov/lov_pack.c
>>> +++ b/drivers/staging/lustre/lustre/lov/lov_pack.c
>>> @@ -448,9 +448,10 @@ int lov_getstripe(struct obd_export *exp, struct lov_stripe_md *lsm,
>>> 	    (lum.lmm_stripe_count < lsm->lsm_stripe_count)) {
>>> 		/* Return right size of stripe to user */
>>> 		lum.lmm_stripe_count = lsm->lsm_stripe_count;
>>> -		rc = copy_to_user(lump, &lum, lum_size);
>>> -		rc = -EOVERFLOW;
>>> -		goto out_set;
>>> +		if (copy_to_user(lump, &lum, lum_size)) {
>>> +			rc = -EFAULT;
>>> +			goto out_set;
>>> +		}

This is bad if only because now if copy to user succeeds we are NOT exiting right here, which
would have lead to buffer overflow in userspace, except we check for this later on
down this path once the striping info is actually refreshed.
Still, it's wrong.

>> I'm not sure this is right, and I don't think we should take it without
>> some lustre people signing off.
>> 
>> The original code looks deliberate, like the error happened earlier and
>> if the copy_to_user() succeed that's fine because it gives them a hint
>> what went wrong, but we want to return an error -EOVERFLOW regardless of
>> if the copy_to_user() works or not.
>> 
> I was little skeptical when sending this patch.I agree with you and we
> shall wait for comments from lustre developers.May be if it was
> purposeful,they could have left out a comment.

Well, there IS a comment. - "Return right size of stripe to user"

Basically what happens here is the userspace told us "hey, what's the striping on this file?
we are ready to accept up to XX size", so here we are on a path where the striping data is bigger than
the buffer supplied. So we fill the header with information about how big the striping is and
return.
Now,  lum_size at this point is
         lum_size = sizeof(struct lov_user_md_v1);

And we even know that we were able to read it before:
        if (copy_from_user(&lum, lump, lum_size))
                GOTO(out, rc = -EFAULT);

So I imagine the only case where this could fail is if we got a pointer to some read-only location
(or there's somebody playing with mappings behind our back?) so it should be totally fine to
do it the other way around:

rc = -EOVERFLOW;
if (copy_to_user(lump, &lum, lum_size))
	rc = -EFAULT;

goto out_set;


Bye,
    Oleg
_______________________________________________
devel mailing list
devel@xxxxxxxxxxxxxxxxxxxxxx
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel




[Index of Archives]     [Linux Driver Backports]     [DMA Engine]     [Linux GPIO]     [Linux SPI]     [Video for Linux]     [Linux USB Devel]     [Linux Coverity]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux