diff options
| author | Linus Torvalds <[email protected]> | 2017-03-26 10:52:52 -0700 | 
|---|---|---|
| committer | Linus Torvalds <[email protected]> | 2017-03-26 10:52:52 -0700 | 
| commit | e431e0e427799805461390df1db1e3478d4c475c (patch) | |
| tree | 34d25d6824ff46638d6fc21a31a2cc48d27e2d1d /drivers/usb/class/usbtmc.c | |
| parent | 42234bf8320aeedaf0bff81e38a7020582c93a6f (diff) | |
| parent | fd290e7096bd4441fdd61e241ee997b16e04afbd (diff) | |
Merge tag 'usb-4.11-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
Pull USB/PHY fixes from Greg KH:
 "Here are a number of small USB and PHY driver fixes for 4.11-rc4.
  Nothing major here, just an bunch of small fixes, and a handfull of
  good fixes from Johan for devices with crazy descriptors. There are a
  few new device ids in here as well.
  All of these have been in linux-next with no reported issues"
* tag 'usb-4.11-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (26 commits)
  usb: gadget: f_hid: fix: Don't access hidg->req without spinlock held
  usb: gadget: udc: remove pointer dereference after free
  usb: gadget: f_uvc: Sanity check wMaxPacketSize for SuperSpeed
  usb: gadget: f_uvc: Fix SuperSpeed companion descriptor's wBytesPerInterval
  usb: gadget: acm: fix endianness in notifications
  usb: dwc3: gadget: delay unmap of bounced requests
  USB: serial: qcserial: add Dell DW5811e
  usb: hub: Fix crash after failure to read BOS descriptor
  ACM gadget: fix endianness in notifications
  USB: usbtmc: fix probe error path
  USB: usbtmc: add missing endpoint sanity check
  USB: serial: option: add Quectel UC15, UC20, EC21, and EC25 modems
  usb: musb: fix possible spinlock deadlock
  usb: musb: dsps: fix iounmap in error and exit paths
  usb: musb: cppi41: don't check early-TX-interrupt for Isoch transfer
  usb-core: Add LINEAR_FRAME_INTR_BINTERVAL USB quirk
  uwb: i1480-dfu: fix NULL-deref at probe
  uwb: hwa-rc: fix NULL-deref at probe
  USB: wusbcore: fix NULL-deref at probe
  USB: uss720: fix NULL-deref at probe
  ...
Diffstat (limited to 'drivers/usb/class/usbtmc.c')
| -rw-r--r-- | drivers/usb/class/usbtmc.c | 18 | 
1 files changed, 15 insertions, 3 deletions
| diff --git a/drivers/usb/class/usbtmc.c b/drivers/usb/class/usbtmc.c index f03692ec5520..8fb309a0ff6b 100644 --- a/drivers/usb/class/usbtmc.c +++ b/drivers/usb/class/usbtmc.c @@ -1381,7 +1381,7 @@ static int usbtmc_probe(struct usb_interface *intf,  	dev_dbg(&intf->dev, "%s called\n", __func__); -	data = kmalloc(sizeof(*data), GFP_KERNEL); +	data = kzalloc(sizeof(*data), GFP_KERNEL);  	if (!data)  		return -ENOMEM; @@ -1444,6 +1444,13 @@ static int usbtmc_probe(struct usb_interface *intf,  			break;  		}  	} + +	if (!data->bulk_out || !data->bulk_in) { +		dev_err(&intf->dev, "bulk endpoints not found\n"); +		retcode = -ENODEV; +		goto err_put; +	} +  	/* Find int endpoint */  	for (n = 0; n < iface_desc->desc.bNumEndpoints; n++) {  		endpoint = &iface_desc->endpoint[n].desc; @@ -1469,8 +1476,10 @@ static int usbtmc_probe(struct usb_interface *intf,  	if (data->iin_ep_present) {  		/* allocate int urb */  		data->iin_urb = usb_alloc_urb(0, GFP_KERNEL); -		if (!data->iin_urb) +		if (!data->iin_urb) { +			retcode = -ENOMEM;  			goto error_register; +		}  		/* Protect interrupt in endpoint data until iin_urb is freed */  		kref_get(&data->kref); @@ -1478,8 +1487,10 @@ static int usbtmc_probe(struct usb_interface *intf,  		/* allocate buffer for interrupt in */  		data->iin_buffer = kmalloc(data->iin_wMaxPacketSize,  					GFP_KERNEL); -		if (!data->iin_buffer) +		if (!data->iin_buffer) { +			retcode = -ENOMEM;  			goto error_register; +		}  		/* fill interrupt urb */  		usb_fill_int_urb(data->iin_urb, data->usb_dev, @@ -1512,6 +1523,7 @@ error_register:  	sysfs_remove_group(&intf->dev.kobj, &capability_attr_grp);  	sysfs_remove_group(&intf->dev.kobj, &data_attr_grp);  	usbtmc_free_int(data); +err_put:  	kref_put(&data->kref, usbtmc_delete);  	return retcode;  } |