mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-09-10 19:20:28 -04:00
serial: core: clear freed pointers on uart_register_driver() failure
uart_register_driver() leaves drv->state pointing to freed memory when tty_alloc_driver() fails. If tty_register_driver() fails, drv->tty_driver also retains a pointer after its reference is dropped. Drivers that use drv->state as an "already registered" flag can then skip registration on the next probe and pass the freed state to uart_add_one_port(). This issue was found with failslab on QEMU's raspi1ap board by failing registration and binding the PL011 port again. Clear both pointers on their failure paths, as uart_unregister_driver() already does. Fixes:1da177e4c3("Linux-2.6.12-rc2") Fixes:9e845abfc8("serial: fix NULL pointer dereference") Assisted-by: Claude:claude-fable-5 Signed-off-by: Karl Mehltretter <kmehltretter@gmail.com> Link: https://patch.msgid.link/20260731181844.11330-3-kmehltretter@gmail.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
1a0e4fbce5
commit
61a2fb2555
@@ -2811,8 +2811,10 @@ int uart_register_driver(struct uart_driver *drv)
|
||||
for (i = 0; i < drv->nr; i++)
|
||||
tty_port_destroy(&drv->state[i].port);
|
||||
tty_driver_kref_put(normal);
|
||||
drv->tty_driver = NULL;
|
||||
out_kfree:
|
||||
kfree(drv->state);
|
||||
drv->state = NULL;
|
||||
out:
|
||||
return retval;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user