* FAILED: patch "[PATCH] ALSA: usb-audio: qcom: Check the return value of qmi_handle_init()" failed to apply to 6.18-stable tree
@ 2026-11-10 1:05 Sasha Levin
2026-11-13 3:17 ` [PATCH 6.18.y 1/2] ALSA: usb-audio: qcom: Free QMI handle Sasha Levin
0 siblings, 1 reply; 3+ messages in thread
From: Sasha Levin @ 2026-11-10 1:05 UTC (permalink / raw)
To: izaiahsun, tiwai; +Cc: stable
The patch below does not apply to the 6.18-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 <stable@vger.kernel.org>.
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.18.y
git checkout FETCH_HEAD
git cherry-pick -x a3cf5ebab5f1db9e6f751e2a08df05a84f37ea57
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<stable@vger.kernel.org>' --in-reply-to '20261109200549-failed-6.18-a3cf5ebab5f1@kernel.org' --subject-prefix 'PATCH 6.18.y' 'HEAD^..'
Thanks,
Sasha
------------------ original commit in Linus's tree ------------------
From a3cf5ebab5f1db9e6f751e2a08df05a84f37ea57 Mon Sep 17 00:00:00 2001
From: Yuqiang Sun <izaiahsun@gmail.com>
Date: Mon, 2 Nov 2026 11:52:37 +0800
Subject: [PATCH] ALSA: usb-audio: qcom: Check the return value of
qmi_handle_init()
qc_usb_audio_probe() overwrites the return value of qmi_handle_init()
with that of qmi_add_server() without checking it. When
qmi_handle_init() fails, it has already freed the receive buffer and
destroyed the workqueue, and qmi->sock may hold an error pointer. If
QRTR is not available, qmi_handle_init() returns -EPROBE_DEFER and
qmi->sock is ERR_PTR(-EAFNOSUPPORT), so qmi_add_server() passes it to
kernel_sendmsg():
BUG: unable to handle page fault for address: ffffffffffffffb7
RIP: 0010:selinux_socket_sendmsg+0xa0/0x590
Call Trace:
security_socket_sendmsg+0x29/0x50
__sock_sendmsg+0x43/0x150
kernel_sendmsg+0xd6/0x180
qmi_send_new_server+0x1b8/0x2b0
qmi_add_server+0x165/0x200
qc_usb_audio_probe+0xf4/0x2e0
really_probe+0x2b4/0x850
Had the probe gone on, the error and remove paths would call
qmi_handle_release() on the half-initialized handle, which destroys the
workqueue and frees the receive buffer a second time.
Return the error from qmi_handle_init(), so that -EPROBE_DEFER defers
the probe, and check qmi_add_server() as well.
The bug was found with kbound, a static analysis prototype for
ownership mismatches at kernel interfaces, on v7.2.12; it is present in
mainline.
Build-tested with x86_64 and arm64 allmodconfig (W=1, sparse): no new
warnings. Run-tested on QEMU (x86_64, KVM) with KASAN and kmemleak, with
the driver built in and a test module that registers the
q6usb.qc-usb-audio-offload auxiliary device. Without QRTR, the probe
crashes as above without this patch; with it the device is deferred and
removing it again reports nothing. With QRTR the probe succeeds, and
removal reports nothing either.
Fixes: 326bbc348298 ("ALSA: usb-audio: qcom: Introduce QC USB SND offloading support")
Cc: stable@vger.kernel.org
Signed-off-by: Yuqiang Sun <izaiahsun@gmail.com>
Link: https://patch.msgid.link/20261102035237.56253-1-izaiahsun@gmail.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
sound/usb/qcom/qc_audio_offload.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/sound/usb/qcom/qc_audio_offload.c b/sound/usb/qcom/qc_audio_offload.c
index e4bfd43a2488b..5ee568e0454cb 100644
--- a/sound/usb/qcom/qc_audio_offload.c
+++ b/sound/usb/qcom/qc_audio_offload.c
@@ -1969,8 +1969,13 @@ static int qc_usb_audio_probe(struct auxiliary_device *auxdev,
QMI_UAUDIO_STREAM_REQ_MSG_V01_MAX_MSG_LEN,
&uaudio_svc_ops_options,
&uaudio_stream_req_handlers);
+ if (ret)
+ goto free_qmi_hdl;
+
ret = qmi_add_server(svc->uaudio_svc_hdl, UAUDIO_STREAM_SERVICE_ID_V01,
UAUDIO_STREAM_SERVICE_VERS_V01, 0);
+ if (ret)
+ goto release_qmi_hdl;
uaudio_svc = svc;
@@ -1987,7 +1992,9 @@ static int qc_usb_audio_probe(struct auxiliary_device *auxdev,
release_qmi:
qc_usb_audio_cleanup_qmi_dev();
+release_qmi_hdl:
qmi_handle_release(svc->uaudio_svc_hdl);
+free_qmi_hdl:
kfree(svc->uaudio_svc_hdl);
free_svc:
kfree(svc);
--
2.53.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH 6.18.y 1/2] ALSA: usb-audio: qcom: Free QMI handle
2026-11-10 1:05 FAILED: patch "[PATCH] ALSA: usb-audio: qcom: Check the return value of qmi_handle_init()" failed to apply to 6.18-stable tree Sasha Levin
@ 2026-11-13 3:17 ` Sasha Levin
2026-11-13 3:17 ` [PATCH 6.18.y 2/2] ALSA: usb-audio: qcom: Check the return value of qmi_handle_init() Sasha Levin
0 siblings, 1 reply; 3+ messages in thread
From: Sasha Levin @ 2026-11-13 3:17 UTC (permalink / raw)
To: stable; +Cc: Xu Rao, Takashi Iwai, Sasha Levin
From: Xu Rao <raoxu@uniontech.com>
[ Upstream commit b8ff1f3578f83dedf5feb796d97a3f67c1bea58f ]
qc_usb_audio_probe() allocates svc->uaudio_svc_hdl separately from the
uaudio_qmi_svc object.
qmi_handle_release() releases the resources owned by an initialized QMI
handle, but does not free the memory containing the struct qmi_handle
itself. The probe error path and the remove path currently release the
handle and then free svc, losing the last pointer to the separately
allocated handle.
This leaks one struct qmi_handle on each affected probe unwind and on
each successful probe/remove cycle.
Free the handle after qmi_handle_release() in both paths.
Signed-off-by: Xu Rao <raoxu@uniontech.com>
Link: https://patch.msgid.link/9108EC860F3F87DF+20260623071308.2549182-1-raoxu@uniontech.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Stable-dep-of: a3cf5ebab5f1 ("ALSA: usb-audio: qcom: Check the return value of qmi_handle_init()")
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
sound/usb/qcom/qc_audio_offload.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/sound/usb/qcom/qc_audio_offload.c b/sound/usb/qcom/qc_audio_offload.c
index da2759f2ee866..62a57b8d171b8 100644
--- a/sound/usb/qcom/qc_audio_offload.c
+++ b/sound/usb/qcom/qc_audio_offload.c
@@ -1994,6 +1994,7 @@ static int qc_usb_audio_probe(struct auxiliary_device *auxdev,
release_qmi:
qc_usb_audio_cleanup_qmi_dev();
qmi_handle_release(svc->uaudio_svc_hdl);
+ kfree(svc->uaudio_svc_hdl);
free_svc:
kfree(svc);
@@ -2018,6 +2019,7 @@ static void qc_usb_audio_remove(struct auxiliary_device *auxdev)
qc_usb_audio_cleanup_qmi_dev();
qmi_handle_release(svc->uaudio_svc_hdl);
+ kfree(svc->uaudio_svc_hdl);
kfree(svc);
uaudio_svc = NULL;
}
--
2.53.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH 6.18.y 2/2] ALSA: usb-audio: qcom: Check the return value of qmi_handle_init()
2026-11-13 3:17 ` [PATCH 6.18.y 1/2] ALSA: usb-audio: qcom: Free QMI handle Sasha Levin
@ 2026-11-13 3:17 ` Sasha Levin
0 siblings, 0 replies; 3+ messages in thread
From: Sasha Levin @ 2026-11-13 3:17 UTC (permalink / raw)
To: stable; +Cc: Yuqiang Sun, Takashi Iwai, Sasha Levin
From: Yuqiang Sun <izaiahsun@gmail.com>
[ Upstream commit a3cf5ebab5f1db9e6f751e2a08df05a84f37ea57 ]
qc_usb_audio_probe() overwrites the return value of qmi_handle_init()
with that of qmi_add_server() without checking it. When
qmi_handle_init() fails, it has already freed the receive buffer and
destroyed the workqueue, and qmi->sock may hold an error pointer. If
QRTR is not available, qmi_handle_init() returns -EPROBE_DEFER and
qmi->sock is ERR_PTR(-EAFNOSUPPORT), so qmi_add_server() passes it to
kernel_sendmsg():
BUG: unable to handle page fault for address: ffffffffffffffb7
RIP: 0010:selinux_socket_sendmsg+0xa0/0x590
Call Trace:
security_socket_sendmsg+0x29/0x50
__sock_sendmsg+0x43/0x150
kernel_sendmsg+0xd6/0x180
qmi_send_new_server+0x1b8/0x2b0
qmi_add_server+0x165/0x200
qc_usb_audio_probe+0xf4/0x2e0
really_probe+0x2b4/0x850
Had the probe gone on, the error and remove paths would call
qmi_handle_release() on the half-initialized handle, which destroys the
workqueue and frees the receive buffer a second time.
Return the error from qmi_handle_init(), so that -EPROBE_DEFER defers
the probe, and check qmi_add_server() as well.
The bug was found with kbound, a static analysis prototype for
ownership mismatches at kernel interfaces, on v7.2.12; it is present in
mainline.
Build-tested with x86_64 and arm64 allmodconfig (W=1, sparse): no new
warnings. Run-tested on QEMU (x86_64, KVM) with KASAN and kmemleak, with
the driver built in and a test module that registers the
q6usb.qc-usb-audio-offload auxiliary device. Without QRTR, the probe
crashes as above without this patch; with it the device is deferred and
removing it again reports nothing. With QRTR the probe succeeds, and
removal reports nothing either.
Fixes: 326bbc348298 ("ALSA: usb-audio: qcom: Introduce QC USB SND offloading support")
Cc: stable@vger.kernel.org
Signed-off-by: Yuqiang Sun <izaiahsun@gmail.com>
Link: https://patch.msgid.link/20261102035237.56253-1-izaiahsun@gmail.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
sound/usb/qcom/qc_audio_offload.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/sound/usb/qcom/qc_audio_offload.c b/sound/usb/qcom/qc_audio_offload.c
index 62a57b8d171b8..3a0a0d8f4654b 100644
--- a/sound/usb/qcom/qc_audio_offload.c
+++ b/sound/usb/qcom/qc_audio_offload.c
@@ -1975,8 +1975,13 @@ static int qc_usb_audio_probe(struct auxiliary_device *auxdev,
QMI_UAUDIO_STREAM_REQ_MSG_V01_MAX_MSG_LEN,
&uaudio_svc_ops_options,
&uaudio_stream_req_handlers);
+ if (ret)
+ goto free_qmi_hdl;
+
ret = qmi_add_server(svc->uaudio_svc_hdl, UAUDIO_STREAM_SERVICE_ID_V01,
UAUDIO_STREAM_SERVICE_VERS_V01, 0);
+ if (ret)
+ goto release_qmi_hdl;
uaudio_svc = svc;
@@ -1993,7 +1998,9 @@ static int qc_usb_audio_probe(struct auxiliary_device *auxdev,
release_qmi:
qc_usb_audio_cleanup_qmi_dev();
+release_qmi_hdl:
qmi_handle_release(svc->uaudio_svc_hdl);
+free_qmi_hdl:
kfree(svc->uaudio_svc_hdl);
free_svc:
kfree(svc);
--
2.53.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-11-13 3:17 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-11-10 1:05 FAILED: patch "[PATCH] ALSA: usb-audio: qcom: Check the return value of qmi_handle_init()" failed to apply to 6.18-stable tree Sasha Levin
2026-11-13 3:17 ` [PATCH 6.18.y 1/2] ALSA: usb-audio: qcom: Free QMI handle Sasha Levin
2026-11-13 3:17 ` [PATCH 6.18.y 2/2] ALSA: usb-audio: qcom: Check the return value of qmi_handle_init() Sasha Levin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox