Re: [syzbot] [net?] possible deadlock in inet6_getname

From: Gerd Rausch

Date: Tue Feb 17 2026 - 12:00:23 EST


Hi,

On 2026-02-14 10:25, Fernando Fernandez Mancera wrote:
--- a/net/rds/tcp_listen.c
+++ b/net/rds/tcp_listen.c
@@ -59,30 +59,12 @@ void rds_tcp_keepalive(struct socket *sock)
 static int
 rds_tcp_get_peer_sport(struct socket *sock)
 {
-    union {
[...]
-    } else {
-        sport = -1;
-    }
+    struct sock *sk = sock->sk;
+
+    if (!sk)
+        return -1;

-    return sport;
+    return ntohs(inet_sk(sk)->inet_dport);
 }

It would be safe from rds_tcp_accept_one() path as the new_sock has a reference count of 1 and no other component should be to release it.

In rds_tcp_conn_slots_available() path, fan-out can be only performed from receive path, AFAIU if data is being processed from the socket we should always be holding a lock.

If these premises are not correct, we can always make this conditional. But getting rid of the kernel_getpeername() call is performance-wise too.


rds_tcp_conn_slots_available() can also be called from rds_conn_shutdown(),
where no "rds_tcp.ko" backend specific lock is held.

This is very solvable though.

Worst case, we can distinguish between the paths where a lock_sock()
is already held from those that don't.

I am testing this against the syzbot report/reproducer.


Thanks,

Gerd