• Andrew Morton's avatar
    [PATCH] Fix VT open/close race · efffe9c8
    Andrew Morton authored
    The race is that con_close() can sleep, and drops the BKL while
    tty->count==1.  But another thread can come into init_dev() and will take a
    new ref against the tty and start using it.
    
    But con_close() doesn't notice that new ref and proceeds to null out
    tty->driver_data while someone else is using the resurrected tty.
    
    So the patch serialises con_close() against init_dev() with tty_sem.
    
    
    Here's a test app which reproduced the oops instantly on 2-way.  It realy
    needs to be run against all tty-capable devices.
    
    /*
     * Run this against a tty which nobody currently has open, such as /dev/tty9
     */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <sys/ioctl.h>
    #include <linux/kd.h>
    
    void doit(char *filename)
    {
    	int fd,x;
    
    	fd = open(filename, O_RDWR);
    	if (fd < 0) {
    		perror("open");
    		exit(1);
    	}
    	ioctl(fd, KDKBDREP, &x);
    	close(fd);
    }
    
    main(int argc, char *argv[])
    {
    	char *filename = argv[1];
    
    	for ( ; ; )
    		doit(filename);
    }
    efffe9c8
tty_io.c 60.9 KB