mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-05 18:39:59 +00:00
tty: Don't call panic() at tty_ldisc_init()
commit 903f9db10f
upstream.
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
c0ed8ece4e
commit
4854b9665c
3 changed files with 8 additions and 4 deletions
|
@ -2815,7 +2815,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);
|
||||||
|
|
|
@ -823,12 +823,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 a new issue