TTY: ttyprintk, unregister tty driver on failure
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: Jiri Slaby <jslaby@suse.cz>
Cc: Samo Pogacnik <samo_pogacnik@t-2.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
38daf88ae1
commit
f06fb543c1
|
@ -217,6 +217,7 @@ static int __init ttyprintk_init(void)
|
|||
return 0;
|
||||
|
||||
error:
|
||||
tty_unregister_driver(ttyprintk_driver);
|
||||
put_tty_driver(ttyprintk_driver);
|
||||
ttyprintk_driver = NULL;
|
||||
return ret;
|
||||
|
|
Loading…
Reference in New Issue