• Jiri Slaby's avatar
    TTY: ttyprintk, unregister tty driver on failure · f06fb543
    Jiri Slaby authored
    When the tty_printk driver fails to create a node in sysfs, the system
    crashes. It is because the driver registers a tty driver and frees it
    without deregistering it first. The fix is easy: add a call to
    tty_unregister_driver to the fail path.
    
    This is very unlikely to happen in usual environment => no need for
    stable.
    
    The crash occurs at some place where we iterate over tty drivers
    first. It may look like this:
    BUG: unable to handle kernel paging request at ffffffffffffff84
    IP: [<ffffffff81278d56>] tty_open+0xd6/0x650
    PGD 1a0d067 PUD 1a0e067 PMD 0
    Oops: 0000 [#1] PREEMPT SMP
    Modules linked in:
    CPU 0
    Pid: 1183, comm: boot.localnet Tainted: G        W    3.5.0-rc7-next-20120716+ #369 Bochs Bochs
    RIP: 0010:[<ffffffff81278d56>]  [<ffffffff81278d56>] tty_open+0xd6/0x650
    RSP: 0018:ffff8800162b3b98  EFLAGS: 00010207
    RAX: 0000000000000000 RBX: ffff880016ba6200 RCX: 0000000000002208
    RDX: 0000000000000000 RSI: 00000000000000d0 RDI: ffffffff81a35080
    RBP: ffff8800162b3c08 R08: ffffffff81276f42 R09: 0000000000400040
    R10: ffff8800161dc005 R11: ffff8800188ee048 R12: 0000000000000000
    R13: ffffffffffffff58 R14: 0000000000400040 R15: 0000000000008000
    FS:  00007f3684abd700(0000) GS:ffff880018e00000(0000) knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: ffffffffffffff84 CR3: 000000001503e000 CR4: 00000000000006f0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
    Process boot.localnet (pid: 1183, threadinfo ffff8800162b2000, task ffff8800188c5880)
    Stack:
     ffff8800162b3c08 ffffffff81363d63 ffffffff81a62940 ffff8800189b4e88
     ffff8800188c5880 ffffffff81123180 0000000000000000 ffffffff18b20600
     0000000000000000 ffff8800189b4e88 ffff880016ba6200 ffff880018b20600
    Call Trace:
     [<ffffffff81363d63>] ? kobj_lookup+0x103/0x160
     [<ffffffff81123180>] ? mount_fs+0x110/0x110
     [<ffffffff81123a9c>] chrdev_open+0x9c/0x1a0
     [<ffffffff81123a00>] ? cdev_put+0x30/0x30
     [<ffffffff8111de76>] do_dentry_open.isra.19+0x1e6/0x270
     [<ffffffff8111df65>] finish_open+0x65/0xa0
     [<ffffffff8112dc9e>] do_last.isra.52+0x26e/0xd80
     [<ffffffff8112b163>] ? inode_permission+0x13/0x50
     [<ffffffff8112b203>] ? link_path_walk+0x63/0x940
     [<ffffffff8112e85b>] path_openat+0xab/0x3d0
     [<ffffffff8112ef5d>] do_filp_open+0x3d/0xa0
     [<ffffffff8113ba72>] ? alloc_fd+0xd2/0x120
     [<ffffffff8111eee3>] do_sys_open+0xf3/0x1d0
     [<ffffffff8111efdc>] sys_open+0x1c/0x20
     [<ffffffff815b5fe2>] system_call_fastpath+0x16/0x1b
    Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
    Cc: Samo Pogacnik <samo_pogacnik@t-2.net>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    f06fb543
ttyprintk.c 5.22 KB