Skip to content

Commit

Permalink
virtio: console: fix race in port_fops_open() and port unplug
Browse files Browse the repository at this point in the history
Between open() being called and processed, the port can be unplugged.
Check if this happened, and bail out.

A simple test script to reproduce this is:

while true; do for i in $(seq 1 100); do echo $i > /dev/vport0p3; done; done;

This opens and closes the port a lot of times; unplugging the port while
this is happening triggers the bug.

CC: <[email protected]>
Signed-off-by: Amit Shah <[email protected]>
Signed-off-by: Rusty Russell <[email protected]>
  • Loading branch information
Amit Shah authored and rustyrussell committed Jul 29, 2013
1 parent 057b82b commit 671bdea
Showing 1 changed file with 4 additions and 0 deletions.
4 changes: 4 additions & 0 deletions drivers/char/virtio_console.c
Original file line number Diff line number Diff line change
Expand Up @@ -1041,6 +1041,10 @@ static int port_fops_open(struct inode *inode, struct file *filp)

/* We get the port with a kref here */
port = find_port_by_devt(cdev->dev);
if (!port) {
/* Port was unplugged before we could proceed */
return -ENXIO;
}
filp->private_data = port;

/*
Expand Down

0 comments on commit 671bdea

Please sign in to comment.