Input: gtco - fix crash on detecting device without endpoints
The gtco driver expects at least one valid endpoint. If given malicious descriptors that specify 0 for the number of endpoints, it will crash in the probe function. Ensure there is at least one endpoint on the interface before using it. Also let's fix a minor coding style issue. The full correct report of this issue can be found in the public Red Hat Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1283385 Reported-by: Ralf Spenneberg <ralf@spenneberg.net> Signed-off-by: Vladis Dronov <vdronov@redhat.com> Cc: stable@vger.kernel.org Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
		
							parent
							
								
									d314e9e80c
								
							
						
					
					
						commit
						162f98dea4
					
				| @ -858,6 +858,14 @@ static int gtco_probe(struct usb_interface *usbinterface, | |||||||
| 		goto err_free_buf; | 		goto err_free_buf; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	/* Sanity check that a device has an endpoint */ | ||||||
|  | 	if (usbinterface->altsetting[0].desc.bNumEndpoints < 1) { | ||||||
|  | 		dev_err(&usbinterface->dev, | ||||||
|  | 			"Invalid number of endpoints\n"); | ||||||
|  | 		error = -EINVAL; | ||||||
|  | 		goto err_free_urb; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * The endpoint is always altsetting 0, we know this since we know | 	 * The endpoint is always altsetting 0, we know this since we know | ||||||
| 	 * this device only has one interrupt endpoint | 	 * this device only has one interrupt endpoint | ||||||
| @ -879,7 +887,7 @@ static int gtco_probe(struct usb_interface *usbinterface, | |||||||
| 	 * HID report descriptor | 	 * HID report descriptor | ||||||
| 	 */ | 	 */ | ||||||
| 	if (usb_get_extra_descriptor(usbinterface->cur_altsetting, | 	if (usb_get_extra_descriptor(usbinterface->cur_altsetting, | ||||||
| 				     HID_DEVICE_TYPE, &hid_desc) != 0){ | 				     HID_DEVICE_TYPE, &hid_desc) != 0) { | ||||||
| 		dev_err(&usbinterface->dev, | 		dev_err(&usbinterface->dev, | ||||||
| 			"Can't retrieve exta USB descriptor to get hid report descriptor length\n"); | 			"Can't retrieve exta USB descriptor to get hid report descriptor length\n"); | ||||||
| 		error = -EIO; | 		error = -EIO; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user