From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: Karl Mehltretter <kmehltretter@gmail.com>
Cc: Jiri Slaby <jirislaby@kernel.org>,
linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org,
stable@vger.kernel.org
Subject: Re: [PATCH v2 3/4] tty: don't oops in tty_unregister_device() when no cdev is registered
Date: Thu, 30 Jul 2026 16:29:57 +0200 [thread overview]
Message-ID: <2026073057-moustache-unfixable-5ab1@gregkh> (raw)
In-Reply-To: <20260719221014.44354-4-kmehltretter@gmail.com>
On Mon, Jul 20, 2026 at 12:10:13AM +0200, Karl Mehltretter wrote:
> serial_core_add_one_port() keeps a uart_port when tty device registration
> fails so setserial can still use it. It marks the port UPF_DEAD and
> returns success. Removing the port later reaches tty_unregister_device(),
> which unconditionally passes driver->cdevs[index] to cdev_del().
>
> The slot does not always contain a live cdev. A serdev registration error
> other than -ENODEV returns before tty_register_device_attr(), leaving the
> slot NULL. If cdev_add() fails, tty_cdev_add() drops the cdev reference
> but leaves the slot pointing at freed memory. The later cdev_del() is
> therefore a NULL dereference or use-after-free.
>
> The NULL path was reproduced with failslab during UART bind on qemu's
> mcimx6ul-evk and raspi1ap boards:
>
> Unhandled fault: page domain fault (0x01b) at 0x00000038
> PC is at cdev_del+0x14/0x34
>
> Clear the slot after cdev_add() fails and only call cdev_del() when it is
> non-NULL. This makes a non-NULL slot mean that a live cdev is registered.
Note, LLMs love to write a lot. Please always rewrite the changelog
text to be sane and concise.
>
> Fixes: c1a752ba2d6b ("tty: don't leak cdev in tty_cdev_add()")
> Fixes: 8cde11b2baa1 ("tty/serdev: add serdev registration interface")
> Cc: stable@vger.kernel.org
> Assisted-by: Claude:claude-fable-5
> Signed-off-by: Karl Mehltretter <kmehltretter@gmail.com>
> ---
> drivers/tty/tty_io.c | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
> index 6b283fd03ff8..4889076b975f 100644
> --- a/drivers/tty/tty_io.c
> +++ b/drivers/tty/tty_io.c
> @@ -3167,8 +3167,10 @@ static int tty_cdev_add(struct tty_driver *driver, dev_t dev,
> driver->cdevs[index]->ops = &tty_fops;
> driver->cdevs[index]->owner = driver->owner;
> err = cdev_add(driver->cdevs[index], dev, count);
> - if (err)
> + if (err) {
> kobject_put(&driver->cdevs[index]->kobj);
> + driver->cdevs[index] = NULL;
> + }
> return err;
> }
>
> @@ -3305,7 +3307,7 @@ EXPORT_SYMBOL_GPL(tty_register_device_attr);
> void tty_unregister_device(struct tty_driver *driver, unsigned index)
> {
> device_destroy(&tty_class, MKDEV(driver->major, driver->minor_start) + index);
> - if (!(driver->flags & TTY_DRIVER_DYNAMIC_ALLOC)) {
> + if (!(driver->flags & TTY_DRIVER_DYNAMIC_ALLOC) && driver->cdevs[index]) {
This looks to be doing 2 different things in one patch, or am I
confused?
thanks,
greg k-h
next prev parent reply other threads:[~2026-07-30 16:19 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-19 22:10 [PATCH v2 0/4] serial: fix console lifetime bugs on failed bind and removal Karl Mehltretter
2026-07-19 22:10 ` [PATCH v2 1/4] serial: core: do fallible allocations before the console can be registered Karl Mehltretter
2026-07-30 14:28 ` Greg Kroah-Hartman
2026-07-19 22:10 ` [PATCH v2 2/4] serial: core: clear freed pointers on uart_register_driver() failure Karl Mehltretter
2026-07-30 14:28 ` Greg Kroah-Hartman
2026-07-19 22:10 ` [PATCH v2 3/4] tty: don't oops in tty_unregister_device() when no cdev is registered Karl Mehltretter
2026-07-30 14:29 ` Greg Kroah-Hartman [this message]
2026-07-19 22:10 ` [PATCH v2 4/4] serial: imx: serialize imx_uart_ports[] lifetime Karl Mehltretter
2026-07-19 22:25 ` sashiko-bot
2026-07-30 14:31 ` Greg Kroah-Hartman
2026-07-30 19:02 ` Frank Li
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2026073057-moustache-unfixable-5ab1@gregkh \
--to=gregkh@linuxfoundation.org \
--cc=jirislaby@kernel.org \
--cc=kmehltretter@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-serial@vger.kernel.org \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.