Re: correct error handling in cdc-wdm

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

 



On Monday 06 April 2009, Oliver Neukum wrote:
> Hi David,
> 
> does this address your concerns?
> 
> 	Regards
> 		Oliver

I'd rather see one on top of mainline; this looks like
it's on top of your previous patch.

Other than that, I think so ... although it touches
a bit more than the original patch!



> commit c6f83b4f7d05e333c41ec872b6d08a9220f2a372
> Author: Oliver Neukum <oneukum@xxxxxxxxxxxxxxx>
> Date:   Mon Apr 6 20:36:49 2009 +0200
> 
>     correct error handling in cdc-wdm's probe method
> 
> diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c
> index 34e6108..d667ceb 100644
> --- a/drivers/usb/class/cdc-wdm.c
> +++ b/drivers/usb/class/cdc-wdm.c
> @@ -3,7 +3,7 @@
>   *
>   * This driver supports USB CDC WCM Device Management.
>   *
> - * Copyright (c) 2007-2008 Oliver Neukum
> + * Copyright (c) 2007-2009 Oliver Neukum
>   *
>   * Some code taken from cdc-acm.c
>   *
> @@ -610,7 +610,7 @@ static int wdm_probe(struct usb_interface *intf, const 
> struct usb_device_id *id)
>  	if (!buffer)
>  		goto out;
>  
> -	while (buflen > 0) {
> +	while (buflen > 1) {

Might was well make that "> 2" (length and type must both
be present for the descriptor to be valid).


>  		if (buffer [1] != USB_DT_CS_INTERFACE) {
>  			dev_err(&intf->dev, "skipping garbage\n");
>  			goto next_desc;
> @@ -646,16 +646,18 @@ next_desc:
>  	spin_lock_init(&desc->iuspin);
>  	init_waitqueue_head(&desc->wait);
>  	desc->wMaxCommand = maxcom;
> +	/* this will be needed in hardware endianness */
>  	desc->inum = cpu_to_le16((u16)intf->cur_altsetting->desc.bInterfaceNumber);

Comment might better point to code that needs to an 8-bit
value in that format; it's just odd to want such a thing.

>  	desc->intf = intf;
>  	INIT_WORK(&desc->rxwork, wdm_rxwork);
>  
> -	iface = &intf->altsetting[0];
> +	rv = -EINVAL;
> +	iface = intf->cur_altsetting;
> +	if (iface->desc.bNumEndpoints != 1)
> +		goto err;
>  	ep = &iface->endpoint[0].desc;
> -	if (!ep || !usb_endpoint_is_int_in(ep)) {

Mainline doesn't test "ep" there, and this shouldn't either.

> -		rv = -EINVAL;
> +	if (!ep || !usb_endpoint_is_int_in(ep))
>  		goto err;
> -	}
>  
>  	desc->wMaxPacketSize = le16_to_cpu(ep->wMaxPacketSize);
>  	desc->bMaxPacketSize0 = udev->descriptor.bMaxPacketSize0;
> @@ -711,12 +713,19 @@ next_desc:
>  
>  	usb_set_intfdata(intf, desc);
>  	rv = usb_register_dev(intf, &wdm_class);
> -	dev_info(&intf->dev, "cdc-wdm%d: USB WDM device\n",
> -		 intf->minor - WDM_MINOR_BASE);
>  	if (rv < 0)
> -		goto err;
> +		goto err3;
> +	else
> +		dev_info(&intf->dev, "cdc-wdm%d: USB WDM device\n",
> +			intf->minor - WDM_MINOR_BASE);
>  out:
>  	return rv;
> +err3:
> +	usb_set_intfdata(intf, NULL);
> +	usb_buffer_free(interface_to_usbdev(desc->intf),
> +			desc->bMaxPacketSize0,
> +			desc->inbuf,
> +			desc->response->transfer_dma);	
>  err2:
>  	usb_buffer_free(interface_to_usbdev(desc->intf),
>  			desc->wMaxPacketSize,
> 
> 



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

[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux