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=883431818e036ae6a9981156a64b821110f39187 Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> Reported-by: syzbot <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: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
598c2d41ff
commit
903f9db10f
|
@ -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);
|
||||||
* 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);
|
||||||
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);
|
||||||
|
|
Loading…
Reference in New Issue