[PATCH] rspiusb: Check usb_buffer_map_sg() retval

Jiri Slaby jirislaby at gmail.com
Sun Aug 23 20:16:53 UTC 2009


On 08/22/2009 07:32 PM, Roel Kluin wrote:
>> you should vfree first...
> 
> Of course. Thanks Jiri, updated patch below,
> 
> Roel

Forgot to add signed-off-by?

Reviewed-by: Jiri Slaby <jirislaby at gmail.com>

> diff --git a/drivers/staging/rspiusb/rspiusb.c b/drivers/staging/rspiusb/rspiusb.c
> index 04e2f92..0495fbf 100644
> --- a/drivers/staging/rspiusb/rspiusb.c
> +++ b/drivers/staging/rspiusb/rspiusb.c
> @@ -611,6 +611,7 @@ static int MapUserBuffer(struct ioctl_struct *io, struct device_extension *pdx)
>  	int i = 0;
>  	int k = 0;
>  	int err = 0;
> +	int ret;
>  	struct page **maplist_p;
>  	int numPagesRequired;
>  
> @@ -687,9 +688,16 @@ static int MapUserBuffer(struct ioctl_struct *io, struct device_extension *pdx)
>  	} else {
>  		pdx->sgl[frameInfo][0].length = count;
>  	}
> -	pdx->sgEntries[frameInfo] =
> -	    usb_buffer_map_sg(pdx->udev, epAddr, pdx->sgl[frameInfo],
> -			      pdx->maplist_numPagesMapped[frameInfo]);
> +	ret = usb_buffer_map_sg(pdx->udev, epAddr, pdx->sgl[frameInfo],
> +			pdx->maplist_numPagesMapped[frameInfo]);
> +	if (ret < 0) {
> +		vfree(maplist_p);
> +		dbg("usb_buffer_map_sg() failed");
> +		return -EINVAL;
> +	}
> +
> +	pdx->sgEntries[frameInfo] = ret;
> +
>  	dbg("number of sgEntries = %d", pdx->sgEntries[frameInfo]);
>  	pdx->userBufMapped = 1;
>  	vfree(maplist_p);
> @@ -716,8 +724,6 @@ 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] =




More information about the devel mailing list