USB: pl2303: fix device initialisation at open
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>
This commit is contained in:
parent
5e4211f1c4
commit
2d8f4447b5
@ -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;
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
@ -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;
|
||||
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user