提交 903f9db1 编写于 作者: T Tetsuo Handa 提交者: Greg Kroah-Hartman

tty: Don't call panic() at tty_ldisc_init()

syzbot is reporting kernel panic [1] triggered by memory allocation failure
at tty_ldisc_get() from tty_ldisc_init(). But since both tty_ldisc_get()
and caller of tty_ldisc_init() can cleanly handle errors, tty_ldisc_init()
does not need to call panic() when tty_ldisc_get() failed.

[1] https://syzkaller.appspot.com/bug?id=883431818e036ae6a9981156a64b821110f39187Signed-off-by: NTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Reported-by: Nsyzbot <syzkaller@googlegroups.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Jiri Slaby <jslaby@suse.com>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
上级 598c2d41
...@@ -2816,7 +2816,10 @@ struct tty_struct *alloc_tty_struct(struct tty_driver *driver, int idx) ...@@ -2816,7 +2816,10 @@ struct tty_struct *alloc_tty_struct(struct tty_driver *driver, int idx)
kref_init(&tty->kref); kref_init(&tty->kref);
tty->magic = TTY_MAGIC; tty->magic = TTY_MAGIC;
tty_ldisc_init(tty); if (tty_ldisc_init(tty)) {
kfree(tty);
return NULL;
}
tty->session = NULL; tty->session = NULL;
tty->pgrp = NULL; tty->pgrp = NULL;
mutex_init(&tty->legacy_mutex); mutex_init(&tty->legacy_mutex);
......
...@@ -821,12 +821,13 @@ EXPORT_SYMBOL_GPL(tty_ldisc_release); ...@@ -821,12 +821,13 @@ EXPORT_SYMBOL_GPL(tty_ldisc_release);
* the tty structure is not completely set up when this call is made. * the tty structure is not completely set up when this call is made.
*/ */
void tty_ldisc_init(struct tty_struct *tty) int tty_ldisc_init(struct tty_struct *tty)
{ {
struct tty_ldisc *ld = tty_ldisc_get(tty, N_TTY); struct tty_ldisc *ld = tty_ldisc_get(tty, N_TTY);
if (IS_ERR(ld)) if (IS_ERR(ld))
panic("n_tty: init_tty"); return PTR_ERR(ld);
tty->ldisc = ld; tty->ldisc = ld;
return 0;
} }
/** /**
......
...@@ -701,7 +701,7 @@ extern int tty_unregister_ldisc(int disc); ...@@ -701,7 +701,7 @@ extern int tty_unregister_ldisc(int disc);
extern int tty_set_ldisc(struct tty_struct *tty, int disc); extern int tty_set_ldisc(struct tty_struct *tty, int disc);
extern int tty_ldisc_setup(struct tty_struct *tty, struct tty_struct *o_tty); extern int tty_ldisc_setup(struct tty_struct *tty, struct tty_struct *o_tty);
extern void tty_ldisc_release(struct tty_struct *tty); extern void tty_ldisc_release(struct tty_struct *tty);
extern void tty_ldisc_init(struct tty_struct *tty); extern int __must_check tty_ldisc_init(struct tty_struct *tty);
extern void tty_ldisc_deinit(struct tty_struct *tty); extern void tty_ldisc_deinit(struct tty_struct *tty);
extern int tty_ldisc_receive_buf(struct tty_ldisc *ld, const unsigned char *p, extern int tty_ldisc_receive_buf(struct tty_ldisc *ld, const unsigned char *p,
char *f, int count); char *f, int count);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册