> On Monday 25 May 2009 21:22:06 Trent Piepho wrote:
>> On Mon, 25 May 2009, Laurent Pinchart wrote:
>> > diff -r e0d881b21bc9 linux/drivers/media/video/v4l2-ioctl.c
>> > --- a/linux/drivers/media/video/v4l2-ioctl.c       Tue May 19 15:12:17 2009
>> > +0200 +++ b/linux/drivers/media/video/v4l2-ioctl.c Sun May 24 18:26:29
>> > 2009 +0200 @@ -402,6 +402,10 @@
>> >               a specific control that caused it. */
>> >            p->error_idx = p->count;
>> >            user_ptr = (void __user *)p->controls;
>> > +          if (p->count > KMALLOC_MAX_SIZE / sizeof(p->controls[0])) {
>> > +                  err = -ENOMEM;
>> > +                  goto out_ext_ctrl;
>> > +          }
>> >            if (p->count) {
>> >                    ctrls_size = sizeof(struct v4l2_ext_control) * p->count;
>> >                    /* Note: v4l2_ext_controls fits in sbuf[] so mbuf is 
>> > still NULL.
>> */
>> > @@ -1859,6 +1863,10 @@
>> >               a specific control that caused it. */
>> >            p->error_idx = p->count;
>> >            user_ptr = (void __user *)p->controls;
>> > +          if (p->count > KMALLOC_MAX_SIZE / sizeof(p->controls[0])) {
>> > +                  err = -ENOMEM;
>> > +                  goto out_ext_ctrl;
>> > +          }
>> >            if (p->count) {
>> >                    ctrls_size = sizeof(struct v4l2_ext_control) * p->count;
>> >                    /* Note: v4l2_ext_controls fits in sbuf[] so mbuf is 
>> > still NULL.
>> */
>> >
>> > Restricting v4l2_ext_controls::count to values smaller than
>> > KMALLOC_MAX_SIZE / sizeof(struct v4l2_ext_control) should be enough,
>> but
>> > we might want to restrict the value even further. I'd like opinions on
>> > this.
>>
>> One thing that could be done is to call access_ok() on the range before
>> kmalloc'ing a buffer.  If p->count is too high, then it's possible that
>> the
>> copy_from_user will fail because the process does not have the address
>> space to copy.
>
> arch/x86/include/asm/uaccess.h, about access_ok():
>
>  * Note that, depending on architecture, this function probably just
>  * checks that the pointer is in the user space range - after calling
>  * this function, memory access functions may still return -EFAULT.
>
> I don't think it's worth it. Let's just kmalloc (or kzalloc) and
> copy_from_user. If one of them fails we'll return an error.
>
> Could a very large number of control requests be used as a DoS attack
> vector ?
> A userspace application could kmalloc large amounts of memory without any
> restriction. Memory would be reclaimed eventually, but after performing a
> large number of USB requests, which could take quite a long time.

Perhaps we should limit the number of controls to a maximum of 1024. That
should really be enough :-)

I'm OK with such a limitation.

Regards,

         Hans

-- 
Hans Verkuil - video4linux developer - sponsored by TANDBERG

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to