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

Commit d3d53894 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman
Browse files

Merge tag 'usb-serial-4.0-rc3' of...

Merge tag 'usb-serial-4.0-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/johan/usb-serial

 into usb-linus

Johan writes:

USB-serial fixes for v4.0-rc3

Here are a few fixes for reported problems including a usb-debug device
buffer overflow, potential use-after-free on failed probe, and a couple
of issues with the USB console.

Some new device IDs are also added.

Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
parents b20b1618 c7d373c3
Loading
Loading
Loading
Loading
+19 −26
Original line number Diff line number Diff line
@@ -38,56 +38,51 @@ static int usb_serial_device_match(struct device *dev,
	return 0;
}

static ssize_t port_number_show(struct device *dev,
				struct device_attribute *attr, char *buf)
{
	struct usb_serial_port *port = to_usb_serial_port(dev);

	return sprintf(buf, "%d\n", port->port_number);
}
static DEVICE_ATTR_RO(port_number);

static int usb_serial_device_probe(struct device *dev)
{
	struct usb_serial_driver *driver;
	struct usb_serial_port *port;
	struct device *tty_dev;
	int retval = 0;
	int minor;

	port = to_usb_serial_port(dev);
	if (!port) {
		retval = -ENODEV;
		goto exit;
	}
	if (!port)
		return -ENODEV;

	/* make sure suspend/resume doesn't race against port_probe */
	retval = usb_autopm_get_interface(port->serial->interface);
	if (retval)
		goto exit;
		return retval;

	driver = port->serial->type;
	if (driver->port_probe) {
		retval = driver->port_probe(port);
		if (retval)
			goto exit_with_autopm;
			goto err_autopm_put;
	}

	retval = device_create_file(dev, &dev_attr_port_number);
	if (retval) {
		if (driver->port_remove)
			retval = driver->port_remove(port);
		goto exit_with_autopm;
	minor = port->minor;
	tty_dev = tty_register_device(usb_serial_tty_driver, minor, dev);
	if (IS_ERR(tty_dev)) {
		retval = PTR_ERR(tty_dev);
		goto err_port_remove;
	}

	minor = port->minor;
	tty_register_device(usb_serial_tty_driver, minor, dev);
	usb_autopm_put_interface(port->serial->interface);

	dev_info(&port->serial->dev->dev,
		 "%s converter now attached to ttyUSB%d\n",
		 driver->description, minor);

exit_with_autopm:
	return 0;

err_port_remove:
	if (driver->port_remove)
		driver->port_remove(port);
err_autopm_put:
	usb_autopm_put_interface(port->serial->interface);
exit:

	return retval;
}

@@ -114,8 +109,6 @@ static int usb_serial_device_remove(struct device *dev)
	minor = port->minor;
	tty_unregister_device(usb_serial_tty_driver, minor);

	device_remove_file(&port->dev, &dev_attr_port_number);

	driver = port->serial->type;
	if (driver->port_remove)
		retval = driver->port_remove(port);
+6 −9
Original line number Diff line number Diff line
@@ -84,6 +84,10 @@ struct ch341_private {
	u8 line_status; /* active status of modem control inputs */
};

static void ch341_set_termios(struct tty_struct *tty,
			      struct usb_serial_port *port,
			      struct ktermios *old_termios);

static int ch341_control_out(struct usb_device *dev, u8 request,
			     u16 value, u16 index)
{
@@ -309,19 +313,12 @@ static int ch341_open(struct tty_struct *tty, struct usb_serial_port *port)
	struct ch341_private *priv = usb_get_serial_port_data(port);
	int r;

	priv->baud_rate = DEFAULT_BAUD_RATE;

	r = ch341_configure(serial->dev, priv);
	if (r)
		goto out;

	r = ch341_set_handshake(serial->dev, priv->line_control);
	if (r)
		goto out;

	r = ch341_set_baudrate(serial->dev, priv);
	if (r)
		goto out;
	if (tty)
		ch341_set_termios(tty, port, NULL);

	dev_dbg(&port->dev, "%s - submitting interrupt urb\n", __func__);
	r = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
+2 −0
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/tty.h>
#include <linux/console.h>
@@ -144,6 +145,7 @@ static int usb_console_setup(struct console *co, char *options)
			init_ldsem(&tty->ldisc_sem);
			INIT_LIST_HEAD(&tty->tty_files);
			kref_get(&tty->driver->kref);
			__module_get(tty->driver->owner);
			tty->ops = &usb_console_fake_tty_ops;
			if (tty_init_termios(tty)) {
				retval = -ENOMEM;
+2 −0
Original line number Diff line number Diff line
@@ -147,6 +147,8 @@ static const struct usb_device_id id_table[] = {
	{ USB_DEVICE(0x166A, 0x0305) }, /* Clipsal C-5000CT2 C-Bus Spectrum Colour Touchscreen */
	{ USB_DEVICE(0x166A, 0x0401) }, /* Clipsal L51xx C-Bus Architectural Dimmer */
	{ USB_DEVICE(0x166A, 0x0101) }, /* Clipsal 5560884 C-Bus Multi-room Audio Matrix Switcher */
	{ USB_DEVICE(0x16C0, 0x09B0) }, /* Lunatico Seletek */
	{ USB_DEVICE(0x16C0, 0x09B1) }, /* Lunatico Seletek */
	{ USB_DEVICE(0x16D6, 0x0001) }, /* Jablotron serial interface */
	{ USB_DEVICE(0x16DC, 0x0010) }, /* W-IE-NE-R Plein & Baus GmbH PL512 Power Supply */
	{ USB_DEVICE(0x16DC, 0x0011) }, /* W-IE-NE-R Plein & Baus GmbH RCM Remote Control for MARATON Power Supply */
+19 −0
Original line number Diff line number Diff line
@@ -799,6 +799,8 @@ static const struct usb_device_id id_table_combined[] = {
	{ USB_DEVICE(FTDI_VID, FTDI_ELSTER_UNICOM_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_PROPOX_JTAGCABLEII_PID) },
	{ USB_DEVICE(FTDI_VID, FTDI_PROPOX_ISPCABLEIII_PID) },
	{ USB_DEVICE(FTDI_VID, CYBER_CORTEX_AV_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_PID),
		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
	{ USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_H_PID),
@@ -978,6 +980,23 @@ static const struct usb_device_id id_table_combined[] = {
	{ USB_DEVICE_INTERFACE_NUMBER(INFINEON_VID, INFINEON_TRIBOARD_PID, 1) },
	/* GE Healthcare devices */
	{ USB_DEVICE(GE_HEALTHCARE_VID, GE_HEALTHCARE_NEMO_TRACKER_PID) },
	/* Active Research (Actisense) devices */
	{ USB_DEVICE(FTDI_VID, ACTISENSE_NDC_PID) },
	{ USB_DEVICE(FTDI_VID, ACTISENSE_USG_PID) },
	{ USB_DEVICE(FTDI_VID, ACTISENSE_NGT_PID) },
	{ USB_DEVICE(FTDI_VID, ACTISENSE_NGW_PID) },
	{ USB_DEVICE(FTDI_VID, ACTISENSE_D9AC_PID) },
	{ USB_DEVICE(FTDI_VID, ACTISENSE_D9AD_PID) },
	{ USB_DEVICE(FTDI_VID, ACTISENSE_D9AE_PID) },
	{ USB_DEVICE(FTDI_VID, ACTISENSE_D9AF_PID) },
	{ USB_DEVICE(FTDI_VID, CHETCO_SEAGAUGE_PID) },
	{ USB_DEVICE(FTDI_VID, CHETCO_SEASWITCH_PID) },
	{ USB_DEVICE(FTDI_VID, CHETCO_SEASMART_NMEA2000_PID) },
	{ USB_DEVICE(FTDI_VID, CHETCO_SEASMART_ETHERNET_PID) },
	{ USB_DEVICE(FTDI_VID, CHETCO_SEASMART_WIFI_PID) },
	{ USB_DEVICE(FTDI_VID, CHETCO_SEASMART_DISPLAY_PID) },
	{ USB_DEVICE(FTDI_VID, CHETCO_SEASMART_LITE_PID) },
	{ USB_DEVICE(FTDI_VID, CHETCO_SEASMART_ANALOG_PID) },
	{ }					/* Terminating entry */
};

Loading