USB: cdc-acm: fix double usb_autopm_put_interface() in acm_port_activate()
If acm_submit_read_urbs() fails in acm_port_activate(), error handling code calls usb_autopm_put_interface() while it is already called before acm_submit_read_urbs(). The patch reorganizes error handling code to avoid double decrement of USB interface's PM-usage counter. Found by Linux Driver Verification project (linuxtesting.org). Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru> Acked-by: Oliver Neukum <oliver@neukum.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
		
							parent
							
								
									f9076e2801
								
							
						
					
					
						commit
						070c0b17f6
					
				| @ -518,13 +518,16 @@ static int acm_port_activate(struct tty_port *port, struct tty_struct *tty) | ||||
| 	if (usb_submit_urb(acm->ctrlurb, GFP_KERNEL)) { | ||||
| 		dev_err(&acm->control->dev, | ||||
| 			"%s - usb_submit_urb(ctrl irq) failed\n", __func__); | ||||
| 		usb_autopm_put_interface(acm->control); | ||||
| 		goto error_submit_urb; | ||||
| 	} | ||||
| 
 | ||||
| 	acm->ctrlout = ACM_CTRL_DTR | ACM_CTRL_RTS; | ||||
| 	if (acm_set_control(acm, acm->ctrlout) < 0 && | ||||
| 	    (acm->ctrl_caps & USB_CDC_CAP_LINE)) | ||||
| 	    (acm->ctrl_caps & USB_CDC_CAP_LINE)) { | ||||
| 		usb_autopm_put_interface(acm->control); | ||||
| 		goto error_set_control; | ||||
| 	} | ||||
| 
 | ||||
| 	usb_autopm_put_interface(acm->control); | ||||
| 
 | ||||
| @ -549,7 +552,6 @@ error_submit_read_urbs: | ||||
| error_set_control: | ||||
| 	usb_kill_urb(acm->ctrlurb); | ||||
| error_submit_urb: | ||||
| 	usb_autopm_put_interface(acm->control); | ||||
| error_get_interface: | ||||
| disconnected: | ||||
| 	mutex_unlock(&acm->mutex); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user