Skip to content

Commit c45f726

Browse files
liweisong-wrDinh Nguyen
authored andcommitted
firmware: stratix10-rsu: Fix NULL pointer dereference when RSU is disabled
When the Remote System Update (RSU) isn't enabled in the First Stage Boot Loader (FSBL), the driver encounters a NULL pointer dereference when excute svc_normal_to_secure_thread() thread, resulting in a kernel panic: Unable to handle kernel NULL pointer dereference at virtual address 0000000000000008 Mem abort info: ... Data abort info: ... [0000000000000008] user address but active_mm is swapper Internal error: Oops: 0000000096000004 [#1] SMP Modules linked in: CPU: 0 UID: 0 PID: 79 Comm: svc_smc_hvc_thr Not tainted 6.19.0-rc8-yocto-standard+ #59 PREEMPT Hardware name: SoCFPGA Stratix 10 SoCDK (DT) pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : svc_normal_to_secure_thread+0x38c/0x990 lr : svc_normal_to_secure_thread+0x144/0x990 ... Call trace: svc_normal_to_secure_thread+0x38c/0x990 (P) kthread+0x150/0x210 ret_from_fork+0x10/0x20 Code: 97cfc11 f9400260 aa1403e1 f9400400 (f9400402) ---[ end trace 0000000000000000 ]--- The issue occurs because rsu_send_async_msg() fails when RSU is not enabled in firmware, causing the channel to be freed via stratix10_svc_free_channel(). However, the probe function continues execution and registers svc_normal_to_secure_thread(), which subsequently attempts to access the already-freed channel, triggering the NULL pointer dereference. Fix this by properly cleaning up the async client and returning early on failure, preventing the thread from being used with an invalid channel. Fixes: 1584753 ("firmware: stratix10-rsu: Migrate RSU driver to use stratix10 asynchronous framework.") Cc: [email protected] Signed-off-by: Liwei Song <[email protected]> Signed-off-by: Dinh Nguyen <[email protected]>
1 parent 6de23f8 commit c45f726

1 file changed

Lines changed: 2 additions & 0 deletions

File tree

drivers/firmware/stratix10-rsu.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -768,7 +768,9 @@ static int stratix10_rsu_probe(struct platform_device *pdev)
768768
rsu_async_status_callback);
769769
if (ret) {
770770
dev_err(dev, "Error, getting RSU status %i\n", ret);
771+
stratix10_svc_remove_async_client(priv->chan);
771772
stratix10_svc_free_channel(priv->chan);
773+
return ret;
772774
}
773775

774776
/* get DCMF version from firmware */

0 commit comments

Comments
 (0)