mirror of
https://github.com/torvalds/linux.git
synced 2026-11-06 21:58:01 +01:00
serial: 8250_bcm7271: fix use-after-free in brcmuart_remove()
brcmuart_handle_irq() starts priv->hrt to work around a receive-timeout
quirk of the 8250 core when hardware flow control is enabled; the timer
callback brcmuart_hrtimer_func() dereferences priv.
brcmuart_remove() cancels the hrtimer before it unregisters the port, so
a receive-timeout interrupt that arrives in between re-arms the timer.
After devm frees priv, the callback runs on freed memory.
Unregister the port before cancelling the hrtimer.
serial8250_unregister_port() shuts the port down and frees its IRQ, so
brcmuart_handle_irq() can no longer restart the timer, and the final
hrtimer_cancel() drains any timer that was armed before or during the
unregister.
This issue was found by an in-house static analysis tool.
Fixes: 41a469482d ("serial: 8250: Add new 8250-core based Broadcom STB driver")
Cc: stable@kernel.org
Assisted-by: Codex:gpt-5.6
Co-developed-by: Song Li <songl@zju.edu.cn>
Signed-off-by: Song Li <songl@zju.edu.cn>
Signed-off-by: Fan Wu <fanwu01@zju.edu.cn>
Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
Link: https://patch.msgid.link/20260909084002.686911-1-fanwu01@zju.edu.cn
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
9d8955281d
commit
189b9dc8c9
|
|
@ -1121,8 +1121,8 @@ static void brcmuart_remove(struct platform_device *pdev)
|
|||
struct brcmuart_priv *priv = platform_get_drvdata(pdev);
|
||||
|
||||
debugfs_remove_recursive(priv->debugfs_dir);
|
||||
hrtimer_cancel(&priv->hrt);
|
||||
serial8250_unregister_port(priv->line);
|
||||
hrtimer_cancel(&priv->hrt);
|
||||
brcmuart_free_bufs(&pdev->dev, priv);
|
||||
if (priv->dma_enabled)
|
||||
brcmuart_arbitration(priv, 0);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user