[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20200817155447.3158787-1-fazilyildiran@gmail.com>
Date: Mon, 17 Aug 2020 15:54:48 +0000
From: Necip Fazil Yildiran <fazilyildiran@...il.com>
To: davem@...emloft.net, kuba@...nel.org
Cc: bjorn.andersson@...aro.org, netdev@...r.kernel.org,
linux-kernel@...r.kernel.org, dvyukov@...gle.com, elver@...gle.com,
andreyknvl@...gle.com, glider@...gle.com, necip@...gle.com,
syzbot+f31428628ef672716ea8@...kaller.appspotmail.com
Subject: [PATCH v3] net: qrtr: fix usage of idr in port assignment to socket
From: Necip Fazil Yildiran <necip@...gle.com>
Passing large uint32 sockaddr_qrtr.port numbers for port allocation
triggers a warning within idr_alloc() since the port number is cast
to int, and thus interpreted as a negative number. This leads to
the rejection of such valid port numbers in qrtr_port_assign() as
idr_alloc() fails.
To avoid the problem, switch to idr_alloc_u32() instead.
Fixes: bdabad3e363d ("net: Add Qualcomm IPC router")
Reported-by: syzbot+f31428628ef672716ea8@...kaller.appspotmail.com
Signed-off-by: Necip Fazil Yildiran <necip@...gle.com>
Reviewed-by: Dmitry Vyukov <dvyukov@...gle.com>
---
v2->v3:
* Use 12-digits long fixes tag instead of 10
v1->v2:
* Use reverse christmas tree ordering for local variables
* Add reviewed-by tag
---
net/qrtr/qrtr.c | 20 +++++++++++---------
1 file changed, 11 insertions(+), 9 deletions(-)
diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c
index b4c0db0b7d31..90c558f89d46 100644
--- a/net/qrtr/qrtr.c
+++ b/net/qrtr/qrtr.c
@@ -692,23 +692,25 @@ static void qrtr_port_remove(struct qrtr_sock *ipc)
*/
static int qrtr_port_assign(struct qrtr_sock *ipc, int *port)
{
+ u32 min_port;
int rc;
mutex_lock(&qrtr_port_lock);
if (!*port) {
- rc = idr_alloc(&qrtr_ports, ipc,
- QRTR_MIN_EPH_SOCKET, QRTR_MAX_EPH_SOCKET + 1,
- GFP_ATOMIC);
- if (rc >= 0)
- *port = rc;
+ min_port = QRTR_MIN_EPH_SOCKET;
+ rc = idr_alloc_u32(&qrtr_ports, ipc, &min_port, QRTR_MAX_EPH_SOCKET, GFP_ATOMIC);
+ if (!rc)
+ *port = min_port;
} else if (*port < QRTR_MIN_EPH_SOCKET && !capable(CAP_NET_ADMIN)) {
rc = -EACCES;
} else if (*port == QRTR_PORT_CTRL) {
- rc = idr_alloc(&qrtr_ports, ipc, 0, 1, GFP_ATOMIC);
+ min_port = 0;
+ rc = idr_alloc_u32(&qrtr_ports, ipc, &min_port, 0, GFP_ATOMIC);
} else {
- rc = idr_alloc(&qrtr_ports, ipc, *port, *port + 1, GFP_ATOMIC);
- if (rc >= 0)
- *port = rc;
+ min_port = *port;
+ rc = idr_alloc_u32(&qrtr_ports, ipc, &min_port, *port, GFP_ATOMIC);
+ if (!rc)
+ *port = min_port;
}
mutex_unlock(&qrtr_port_lock);
--
2.28.0.220.ged08abb693-goog
Powered by blists - more mailing lists