From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1E7A82BDC29 for ; Sun, 3 May 2026 19:14:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777835658; cv=none; b=D00CIRyeFgzxpyiUi0cUYfiNTsGoqVdrMHWbe0f0ovZAazlhmNbJLmucAPliiBWOWNwxcBVWyTnyFKtlZLyQQR8hFd76/cD/KJXC36INHy8Ka3wkSGCAKQYhkbT5L/PI04ivOqEGPLyUkjC/nLaAsYEp3+Vb5T1oMDziMnO/hPM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777835658; c=relaxed/simple; bh=gW0czXoY+lMhFLZ8xa+BDABQoOc2gfYhNVVNvbxihmg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nEZhn8RrYR9gQvTaSSFGmcCN4ftP3tr01QZMTL0r200W7jnjEqlusUTRlJzxI1C4yUPtgVJvKMc6Lz0d9710/EDAu9MapWnwFtgT/4M/y8KhnuWEUN7jN//NRqvdHtWBT346owkUJGCxrbrrQgmDxxxCpPLN5uQkcgn9/a3hV/w= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=GVyBautY; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="GVyBautY" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CFBB8C2BCB4; Sun, 3 May 2026 19:14:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1777835657; bh=gW0czXoY+lMhFLZ8xa+BDABQoOc2gfYhNVVNvbxihmg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=GVyBautYVAu/Q29t4SoEwdhq25ne7RN3KQu8GJ56//SBTMPEJCH+XEOZJPOHsVQ43 NMrCAtaZlU90FZE8N9AabQHuRzP6hvD9g/uPxN0fB2aRNK14J3PXhpW88veUHYWAAl ipj2ru5HW4Kue+V0CwP0azrL/QpeKiQU+hx2OOG7oilum0nMw8wiHD0LPN7R0coBMq d7X0HZBAOQLes+XYCzWsKHRymAWEhbs8/tavLDqW4oXExd6UpxBpTsrMTTic/s238r NoDWE37yBZYwMHSC8JUTr61jm+7T/Qu9OhCBdTOyepu4biM8C5YssTwDyjIgpXF2hx 4cXs0y9DKRMiw== From: Sasha Levin To: stable@vger.kernel.org Cc: Manivannan Sadhasivam , Yiming Qian , Simon Horman , Jakub Kicinski , Sasha Levin Subject: [PATCH 6.12.y] net: qrtr: ns: Limit the maximum server registration per node Date: Sun, 3 May 2026 15:14:12 -0400 Message-ID: <20260503191412.1286176-1-sashal@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <2026050101-unreal-tribute-c694@gregkh> References: <2026050101-unreal-tribute-c694@gregkh> Precedence: bulk X-Mailing-List: stable@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Manivannan Sadhasivam [ Upstream commit d5ee2ff98322337951c56398e79d51815acbf955 ] Current code does no bound checking on the number of servers added per node. A malicious client can flood NEW_SERVER messages and exhaust memory. Fix this issue by limiting the maximum number of server registrations to 256 per node. If the NEW_SERVER message is received for an old port, then don't restrict it as it will get replaced. While at it, also rate limit the error messages in the failure path of qrtr_ns_worker(). Note that the limit of 256 is chosen based on the current platform requirements. If requirement changes in the future, this limit can be increased. Cc: stable@vger.kernel.org Fixes: 0c2204a4ad71 ("net: qrtr: Migrate nameservice to kernel from userspace") Reported-by: Yiming Qian Reviewed-by: Simon Horman Signed-off-by: Manivannan Sadhasivam Link: https://patch.msgid.link/20260409-qrtr-fix-v3-1-00a8a5ff2b51@oss.qualcomm.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- net/qrtr/ns.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/net/qrtr/ns.c b/net/qrtr/ns.c index 3de9350cbf307..9166c26349259 100644 --- a/net/qrtr/ns.c +++ b/net/qrtr/ns.c @@ -67,8 +67,14 @@ struct qrtr_server { struct qrtr_node { unsigned int id; struct xarray servers; + u32 server_count; }; +/* Max server limit is chosen based on the current platform requirements. If the + * requirement changes in the future, this value can be increased. + */ +#define QRTR_NS_MAX_SERVERS 256 + static struct qrtr_node *node_get(unsigned int node_id) { struct qrtr_node *node; @@ -229,6 +235,17 @@ static struct qrtr_server *server_add(unsigned int service, if (!service || !port) return NULL; + node = node_get(node_id); + if (!node) + return NULL; + + /* Make sure the new servers per port are capped at the maximum value */ + old = xa_load(&node->servers, port); + if (!old && node->server_count >= QRTR_NS_MAX_SERVERS) { + pr_err_ratelimited("QRTR client node %u exceeds max server limit!\n", node_id); + return NULL; + } + srv = kzalloc(sizeof(*srv), GFP_KERNEL); if (!srv) return NULL; @@ -238,10 +255,6 @@ static struct qrtr_server *server_add(unsigned int service, srv->node = node_id; srv->port = port; - node = node_get(node_id); - if (!node) - goto err; - /* Delete the old server on the same port */ old = xa_store(&node->servers, port, srv, GFP_KERNEL); if (old) { @@ -252,6 +265,8 @@ static struct qrtr_server *server_add(unsigned int service, } else { kfree(old); } + } else { + node->server_count++; } trace_qrtr_ns_server_add(srv->service, srv->instance, @@ -292,6 +307,7 @@ static int server_del(struct qrtr_node *node, unsigned int port, bool bcast) } kfree(srv); + node->server_count--; return 0; } @@ -670,7 +686,7 @@ static void qrtr_ns_worker(struct work_struct *work) } if (ret < 0) - pr_err("failed while handling packet from %d:%d", + pr_err_ratelimited("failed while handling packet from %d:%d", sq.sq_node, sq.sq_port); } -- 2.53.0