[PATCH] net: qrtr: fix usage of idr in port assignment to socket

Subsystems: networking [general], qualcomm ipc router (qrtr) driver, the rest

STALE2200d

3 messages, 3 authors, 2020-08-16 · open the first message on its own page

[PATCH] net: qrtr: fix usage of idr in port assignment to socket

From: Necip Fazil Yildiran <hidden>
Date: 2020-08-14 10:10:45

From: Necip Fazil Yildiran <redacted>

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: bdabad3e36 ("net: Add Qualcomm IPC router")
Reported-by: syzbot+f31428628ef672716ea8@syzkaller.appspotmail.com
Signed-off-by: Necip Fazil Yildiran <redacted>
---
 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..52d0707df776 100644
--- a/net/qrtr/qrtr.c
+++ b/net/qrtr/qrtr.c
@@ -693,22 +693,24 @@ static void qrtr_port_remove(struct qrtr_sock *ipc)
 static int qrtr_port_assign(struct qrtr_sock *ipc, int *port)
 {
 	int rc;
+	u32 min_port;
 
 	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

Re: [PATCH] net: qrtr: fix usage of idr in port assignment to socket

From: David Miller <davem@davemloft.net>
Date: 2020-08-14 20:55:30

From: Necip Fazil Yildiran <redacted>
Date: Fri, 14 Aug 2020 10:10:00 +0000
quoted hunk
diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c
index b4c0db0b7d31..52d0707df776 100644
--- a/net/qrtr/qrtr.c
+++ b/net/qrtr/qrtr.c
@@ -693,22 +693,24 @@ static void qrtr_port_remove(struct qrtr_sock *ipc)
 static int qrtr_port_assign(struct qrtr_sock *ipc, int *port)
 {
 	int rc;
+	u32 min_port;
Please use reverse christmas tree ordering for local variables.

Re: [PATCH] net: qrtr: fix usage of idr in port assignment to socket

From: Dmitry Vyukov <dvyukov@google.com>
Date: 2020-08-16 15:36:16

On Fri, Aug 14, 2020 at 10:55 PM David Miller [off-list ref] wrote:
From: Necip Fazil Yildiran <redacted>
Date: Fri, 14 Aug 2020 10:10:00 +0000
quoted
diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c
index b4c0db0b7d31..52d0707df776 100644
--- a/net/qrtr/qrtr.c
+++ b/net/qrtr/qrtr.c
@@ -693,22 +693,24 @@ static void qrtr_port_remove(struct qrtr_sock *ipc)
 static int qrtr_port_assign(struct qrtr_sock *ipc, int *port)
 {
      int rc;
+     u32 min_port;
Please use reverse christmas tree ordering for local variables.
If Dave's comment is fixed:

Reviewed-by: Dmitry Vyukov <dvyukov@google.com>

(add this tag to the v2 of this patch).

Just in case: "reverse christmas tree" is when variable declarations
are sorted by line length (longest first).
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help