[PATCH 5/5] Staging: rspiusb: Fix buffer overflow

Jiri Slaby jirislaby at gmail.com
Fri Aug 21 01:12:51 PDT 2009


On 08/08/2009 01:32 AM, Greg Kroah-Hartman wrote:
> From: Roel Kluin <roel.kluin at gmail.com>
> 
> usb_buffer_map_sg() may return -1. This will result in a read from
> pdx->PixelUrb[frameInfo][-1]
> 
> Signed-off-by: Roel Kluin <roel.kluin at gmail.com>
> Signed-off-by: Greg Kroah-Hartman <gregkh at suse.de>
> ---
>  drivers/staging/rspiusb/rspiusb.c |    2 ++
>  1 files changed, 2 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/staging/rspiusb/rspiusb.c b/drivers/staging/rspiusb/rspiusb.c
> index 2f8155c..04e2f92 100644
> --- a/drivers/staging/rspiusb/rspiusb.c
> +++ b/drivers/staging/rspiusb/rspiusb.c
> @@ -716,6 +716,8 @@ static int MapUserBuffer(struct ioctl_struct *io, struct device_extension *pdx)
>  		pdx->PixelUrb[frameInfo][i]->transfer_flags =
>  		    URB_NO_TRANSFER_DMA_MAP | URB_NO_INTERRUPT;
>  	}
> +	if (i == 0)
> +		return -EINVAL;
>  	/* only interrupt when last URB completes */
>  	pdx->PixelUrb[frameInfo][--i]->transfer_flags &= ~URB_NO_INTERRUPT;
>  	pdx->pendedPixelUrbs[frameInfo] =

This is rather pointless. If usb_buffer_map_sg returns error (negative
value), we will die earlier on most machines, since we pass some
0xffffffXX to kmalloc as a size.

The proper fix is to check usb_buffer_map_sg retval here.


More information about the devel mailing list