Skip to content

Commit

Permalink
USB: pl2303: fix device initialisation at open
Browse files Browse the repository at this point in the history
Do not use uninitialised termios data to determine when to configure the
device at open.

This also prevents stack data from leaking to userspace in the OOM error
path.

Cc: stable@vger.kernel.org
Signed-off-by: Johan Hovold <jhovold@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Johan Hovold authored and Greg Kroah-Hartman committed Jun 10, 2013
1 parent 5e4211f commit 2d8f444
Showing 1 changed file with 5 additions and 5 deletions.
10 changes: 5 additions & 5 deletions drivers/usb/serial/pl2303.c
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ static void pl2303_set_termios(struct tty_struct *tty,
serial settings even to the same values as before. Thus
we actually need to filter in this specific case */

if (!tty_termios_hw_change(&tty->termios, old_termios))
if (old_termios && !tty_termios_hw_change(&tty->termios, old_termios))
return;

cflag = tty->termios.c_cflag;
Expand All @@ -293,7 +293,8 @@ static void pl2303_set_termios(struct tty_struct *tty,
if (!buf) {
dev_err(&port->dev, "%s - out of memory.\n", __func__);
/* Report back no change occurred */
tty->termios = *old_termios;
if (old_termios)
tty->termios = *old_termios;
return;
}

Expand Down Expand Up @@ -433,7 +434,7 @@ static void pl2303_set_termios(struct tty_struct *tty,
control = priv->line_control;
if ((cflag & CBAUD) == B0)
priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
else if ((old_termios->c_cflag & CBAUD) == B0)
else if (old_termios && (old_termios->c_cflag & CBAUD) == B0)
priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
if (control != priv->line_control) {
control = priv->line_control;
Expand Down Expand Up @@ -492,7 +493,6 @@ static void pl2303_close(struct usb_serial_port *port)

static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)
{
struct ktermios tmp_termios;
struct usb_serial *serial = port->serial;
struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
int result;
Expand All @@ -508,7 +508,7 @@ static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)

/* Setup termios */
if (tty)
pl2303_set_termios(tty, port, &tmp_termios);
pl2303_set_termios(tty, port, NULL);

result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
if (result) {
Expand Down

0 comments on commit 2d8f444

Please sign in to comment.