mirror of
https://github.com/torvalds/linux.git
synced 2026-09-14 16:10:02 +02: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:
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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user