FAILED: patch "[PATCH] misc: fastrpc: Fix NULL pointer dereference in rpmsg callback" failed to apply to 6.1-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 6.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.1.y
git checkout FETCH_HEAD
git cherry-pick -x 5401fb4fe10fac6134c308495df18ed74aebb9c4
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026061529-portable-excusable-b916@gregkh' --subject-prefix 'PATCH 6.1.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 5401fb4fe10fac6134c308495df18ed74aebb9c4 Mon Sep 17 00:00:00 2001
From: Mukesh Ojha <[email protected]>
Date: Sat, 30 May 2026 21:45:27 +0100
Subject: [PATCH] misc: fastrpc: Fix NULL pointer dereference in rpmsg callback
A NULL pointer dereference was observed on Hawi at boot when the DSP sends a glink message before fastrpc_rpmsg_probe() has completed initialization:
Unable to handle kernel NULL pointer dereference at virtual address 0000000000000178 pc : _raw_spin_lock_irqsave+0x34/0x8c lr : fastrpc_rpmsg_callback+0x3c/0xcc [fastrpc] ... Call trace: _raw_spin_lock_irqsave+0x34/0x8c (P) fastrpc_rpmsg_callback+0x3c/0xcc [fastrpc] qcom_glink_native_rx+0x538/0x6a4 qcom_glink_smem_intr+0x14/0x24 [qcom_glink_smem]
The faulting address 0x178 corresponds to the lock variable inside struct fastrpc_channel_ctx, confirming that cctx is NULL when fastrpc_rpmsg_callback() attempts to take the spinlock.
There are two issues here. First, dev_set_drvdata() is called before spin_lock_init() and idr_init(), leaving a window where the callback can retrieve a valid cctx pointer but operate on an uninitialized spinlock. Second, the rpmsg channel becomes live as soon as the driver is bound, so fastrpc_rpmsg_callback() can fire before dev_set_drvdata() is called at all, resulting in dev_get_drvdata() returning NULL.
Fix both issues by moving all cctx initialization ahead of dev_set_drvdata() so the structure is fully initialized before it becomes visible to the callback, and add a NULL check in fastrpc_rpmsg_callback() as a guard against any remaining window.
drivers/misc/fastrpc.c +4 -1
@@ -2460,7 +2460,6 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)kref_init (&data->refcount); -dev_set_drvdata (&rpdev->dev, data); rdev->dma_mask = &data->dma_mask;dma_set_mask_and_coherent (rdev,DMA_BIT_MASK (32 ));INIT_LIST_HEAD (&data->users);
@@ -2469,6 +2468,7 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)idr_init (&data->ctx_idr); data->domain_id = domain_id; data->rpdev = rpdev; +dev_set_drvdata (&rpdev->dev, data); err =of_platform_populate (rdev->of_node,NULL ,NULL , rdev);if (err)
@@ -2542,6 +2542,9 @@ static int fastrpc_rpmsg_callback(struct rpmsg_device *rpdev, void *data,if (len <sizeof (*rsp))return -EINVAL ; +if (!cctx) +return -ENODEV ; + ctxid = ((rsp->ctx &FASTRPC_CTXID_MASK ) >>4 );spin_lock_irqsave (&cctx->lock, flags);
Sasha Levin
maintainerPATCH 1/2 misc: fastrpc: Add dma_mask to fastrpc_channel_ctx
From: Abel Vesa <[email protected]>
[ Upstream commit 9bde43a0e2f469961e18d0a3496a9a74379c22bf ]
dma_set_mask_and_coherent only updates the mask to which the device dma_mask pointer points to. Add a dma_mask to the channel ctx and set the device dma_mask to point to that, otherwise the dma_set_mask will return an error and the dma_set_coherent_mask will be skipped too.
Stable-dep-of: 5401fb4fe10f ("misc: fastrpc: Fix NULL pointer dereference in rpmsg callback")
--- drivers/misc/fastrpc.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/misc/fastrpc.c +2 -0
@@ -262,6 +262,7 @@ struct fastrpc_channel_ctx {struct fastrpc_device *fdevice;bool secure;bool unsigned_support; +u64 dma_mask; };struct fastrpc_device {
@@ -2149,6 +2150,7 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)kref_init (&data->refcount);dev_set_drvdata (&rpdev->dev, data); + rdev->dma_mask = &data->dma_mask;dma_set_mask_and_coherent (rdev,DMA_BIT_MASK (32 ));INIT_LIST_HEAD (&data->users);spin_lock_init (&data->lock);
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/2 misc: fastrpc: Fix NULL pointer dereference in rpmsg callback
From: Mukesh Ojha <[email protected]>
[ Upstream commit 5401fb4fe10fac6134c308495df18ed74aebb9c4 ]
A NULL pointer dereference was observed on Hawi at boot when the DSP sends a glink message before fastrpc_rpmsg_probe() has completed initialization:
Unable to handle kernel NULL pointer dereference at virtual address 0000000000000178 pc : _raw_spin_lock_irqsave+0x34/0x8c lr : fastrpc_rpmsg_callback+0x3c/0xcc [fastrpc] ... Call trace: _raw_spin_lock_irqsave+0x34/0x8c (P) fastrpc_rpmsg_callback+0x3c/0xcc [fastrpc] qcom_glink_native_rx+0x538/0x6a4 qcom_glink_smem_intr+0x14/0x24 [qcom_glink_smem]
The faulting address 0x178 corresponds to the lock variable inside struct fastrpc_channel_ctx, confirming that cctx is NULL when fastrpc_rpmsg_callback() attempts to take the spinlock.
There are two issues here. First, dev_set_drvdata() is called before spin_lock_init() and idr_init(), leaving a window where the callback can retrieve a valid cctx pointer but operate on an uninitialized spinlock. Second, the rpmsg channel becomes live as soon as the driver is bound, so fastrpc_rpmsg_callback() can fire before dev_set_drvdata() is called at all, resulting in dev_get_drvdata() returning NULL.
Fix both issues by moving all cctx initialization ahead of dev_set_drvdata() so the structure is fully initialized before it becomes visible to the callback, and add a NULL check in fastrpc_rpmsg_callback() as a guard against any remaining window.
--- drivers/misc/fastrpc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/misc/fastrpc.c +4 -1
@@ -2149,7 +2149,6 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)kref_init (&data->refcount); -dev_set_drvdata (&rpdev->dev, data); rdev->dma_mask = &data->dma_mask;dma_set_mask_and_coherent (rdev,DMA_BIT_MASK (32 ));INIT_LIST_HEAD (&data->users);
@@ -2157,6 +2156,7 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)idr_init (&data->ctx_idr); data->domain_id = domain_id; data->rpdev = rpdev; +dev_set_drvdata (&rpdev->dev, data); err =of_platform_populate (rdev->of_node,NULL ,NULL , rdev);if (err)
@@ -2223,6 +2223,9 @@ static int fastrpc_rpmsg_callback(struct rpmsg_device *rpdev, void *data,if (len <sizeof (*rsp))return -EINVAL ; +if (!cctx) +return -ENODEV ; + ctxid = ((rsp->ctx &FASTRPC_CTXID_MASK ) >>4 );spin_lock_irqsave (&cctx->lock, flags);
Signature · 1 line
2.53.0