udp: fix l4 hash after reconnect
authorPaolo Abeni <pabeni@redhat.com>
Fri, 6 Dec 2024 15:49:14 +0000 (16:49 +0100)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 10 Dec 2024 14:30:36 +0000 (15:30 +0100)
After the blamed commit below, udp_rehash() is supposed to be called
with both local and remote addresses set.

Currently that is already the case for IPv6 sockets, but for IPv4 the
destination address is updated after rehashing.

Address the issue moving the destination address and port initialization
before rehashing.

Fixes: 1b29a730ef8b ("ipv6/udp: Add 4-tuple hash for connected socket")
Reviewed-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/4761e466ab9f7542c68cdc95f248987d127044d2.1733499715.git.pabeni@redhat.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/ipv4/datagram.c

index cc6d0bd7b0a96a2676589902da5f1eb114f6d85e..4aca1f05edd3146403c53e319e53221ff78ab1b2 100644 (file)
@@ -61,15 +61,17 @@ int __ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len
                err = -EACCES;
                goto out;
        }
+
+       /* Update addresses before rehashing */
+       inet->inet_daddr = fl4->daddr;
+       inet->inet_dport = usin->sin_port;
        if (!inet->inet_saddr)
-               inet->inet_saddr = fl4->saddr;  /* Update source address */
+               inet->inet_saddr = fl4->saddr;
        if (!inet->inet_rcv_saddr) {
                inet->inet_rcv_saddr = fl4->saddr;
                if (sk->sk_prot->rehash)
                        sk->sk_prot->rehash(sk);
        }
-       inet->inet_daddr = fl4->daddr;
-       inet->inet_dport = usin->sin_port;
        reuseport_has_conns_set(sk);
        sk->sk_state = TCP_ESTABLISHED;
        sk_set_txhash(sk);