virtio: console: Don't access vqs if device was unplugged
Subsystems (3)
PATCH 1/1 virtio: console: Don't access vqs if device was unplugged
From: Amit Shah <[email protected]>
If a virtio-console device gets unplugged while a port is open, a subsequent close() call on the port accesses vqs to free up buffers. This can lead to a crash.
The buffers are already freed up as a result of the call to unplug_ports() from virtcons_remove(). The fix is to simply not access vq information if port->portdev is NULL.
Reported-by juzhang <[email protected]>
Signed-off-by Amit Shah <[email protected]>
Signed-off-by Rusty Russell <[email protected]>
--- drivers/char/virtio_console.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/char/virtio_console.c +8 -0
@@ -388,6 +388,10 @@ static void discard_port_data(struct port *port)unsigned int len;int ret; +if (!port->portdev) { +/* Device has been unplugged. vqs are already gone. */ +return ; + } vq = port->in_vq;if (port->inbuf) buf = port->inbuf;
@@ -470,6 +474,10 @@ static void reclaim_consumed_buffers(struct port *port)void *buf;unsigned int len; +if (!port->portdev) { +/* Device has been unplugged. vqs are already gone. */ +return ; + }while ((buf =virtqueue_get_buf (port->out_vq, &len))) {kfree (buf); port->outvq_full = false;