Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6774d5f5 authored by Johan Hovold's avatar Johan Hovold
Browse files

USB: serial: kl5kusb105: fix open error path



Kill urbs and disable read before returning from open on failure to
retrieve the line state.

Fixes: 1da177e4 ("Linux-2.6.12-rc2")
Cc: stable <stable@vger.kernel.org>
Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
parent 0c9bd600
Loading
Loading
Loading
Loading
+24 −9
Original line number Diff line number Diff line
@@ -296,7 +296,7 @@ static int klsi_105_open(struct tty_struct *tty, struct usb_serial_port *port)
	rc = usb_serial_generic_open(tty, port);
	if (rc) {
		retval = rc;
		goto exit;
		goto err_free_cfg;
	}

	rc = usb_control_msg(port->serial->dev,
@@ -315,17 +315,32 @@ static int klsi_105_open(struct tty_struct *tty, struct usb_serial_port *port)
		dev_dbg(&port->dev, "%s - enabled reading\n", __func__);

	rc = klsi_105_get_line_state(port, &line_state);
	if (rc >= 0) {
	if (rc < 0) {
		retval = rc;
		goto err_disable_read;
	}

	spin_lock_irqsave(&priv->lock, flags);
	priv->line_state = line_state;
	spin_unlock_irqrestore(&priv->lock, flags);
		dev_dbg(&port->dev, "%s - read line state 0x%lx\n", __func__, line_state);
		retval = 0;
	} else
		retval = rc;
	dev_dbg(&port->dev, "%s - read line state 0x%lx\n", __func__,
			line_state);

	return 0;

exit:
err_disable_read:
	usb_control_msg(port->serial->dev,
			     usb_sndctrlpipe(port->serial->dev, 0),
			     KL5KUSB105A_SIO_CONFIGURE,
			     USB_TYPE_VENDOR | USB_DIR_OUT,
			     KL5KUSB105A_SIO_CONFIGURE_READ_OFF,
			     0, /* index */
			     NULL, 0,
			     KLSI_TIMEOUT);
	usb_serial_generic_close(port);
err_free_cfg:
	kfree(cfg);

	return retval;
}