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.
--
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