[PATCH 1/3] soc: qcom: qmi: Take responses and indications only from looked-up servers

From: Julius Bairaktaris

Date: Wed Nov 11 2026 - 03:09:19 EST


Any local process can open an AF_QIPCRTR socket and send a datagram to
the port of a kernel QMI client. qrtr_local_enqueue() queues it no
matter which server the client socket is connected to, and
qmi_handle_message() passes responses and indications to the client's
handlers without looking at the sender. The ath11k and ath12k
REQUEST_MEM indication handlers, for one, then free the DMA memory that
the running firmware writes into.

A client handle learns its servers from the lookups it registered, and
qmi_recv_new_server() keeps them in lookup_results. Drop responses and
indications from any other address. Handles without a new_server
callback keep no lookup results and are left as they are.

Fixes: 3830d0771ef6 ("soc: qcom: Introduce QMI helpers")
Cc: stable@xxxxxxxxxxxxxxx
Signed-off-by: Julius Bairaktaris <julius@xxxxxxxxxxxxxx>
---
drivers/soc/qcom/qmi_interface.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)

diff --git a/drivers/soc/qcom/qmi_interface.c b/drivers/soc/qcom/qmi_interface.c
index 16e2e24b60968..ba9d973279145 100644
--- a/drivers/soc/qcom/qmi_interface.c
+++ b/drivers/soc/qcom/qmi_interface.c
@@ -469,6 +469,19 @@ static void qmi_handle_net_reset(struct qmi_handle *qmi)
qmi_send_new_server(qmi, svc);
}

+static bool qmi_is_lookup_result(struct qmi_handle *qmi,
+ struct sockaddr_qrtr *sq)
+{
+ struct qmi_service *svc;
+
+ list_for_each_entry(svc, &qmi->lookup_results, list_node) {
+ if (svc->node == sq->sq_node && svc->port == sq->sq_port)
+ return true;
+ }
+
+ return false;
+}
+
static void qmi_handle_message(struct qmi_handle *qmi,
struct sockaddr_qrtr *sq,
const void *buf, size_t len)
@@ -485,6 +498,11 @@ static void qmi_handle_message(struct qmi_handle *qmi,

hdr = buf;

+ /* A client takes responses and indications only from its servers */
+ if (qmi->ops.new_server && hdr->type != QMI_REQUEST &&
+ !qmi_is_lookup_result(qmi, sq))
+ return;
+
/* If this is a response, find the matching transaction handle */
if (hdr->type == QMI_RESPONSE) {
mutex_lock(&qmi->txn_lock);
--
2.53.0