l2tp: handle hash key collisions in l2tp_v3_session_get
authorJames Chapman <jchapman@katalix.com>
Wed, 7 Aug 2024 06:54:47 +0000 (07:54 +0100)
committerDavid S. Miller <davem@davemloft.net>
Sun, 11 Aug 2024 03:38:49 +0000 (04:38 +0100)
To handle colliding l2tpv3 session IDs, l2tp_v3_session_get searches a
hashed list keyed by ID and sk. Although unlikely, if hash keys
collide, it is possible that hash_for_each_possible loops over a
session which doesn't have the ID that we are searching for. So check
for session ID match when looping over possible hash key matches.

Signed-off-by: James Chapman <jchapman@katalix.com>
Signed-off-by: Tom Parkin <tparkin@katalix.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/l2tp/l2tp_core.c

index 70c231f..3b34e54 100644 (file)
@@ -291,7 +291,8 @@ struct l2tp_session *l2tp_v3_session_get(const struct net *net, struct sock *sk,
                         */
                        struct l2tp_tunnel *tunnel = READ_ONCE(session->tunnel);
 
-                       if (tunnel && tunnel->sock == sk &&
+                       if (session->session_id == session_id &&
+                           tunnel && tunnel->sock == sk &&
                            refcount_inc_not_zero(&session->ref_count)) {
                                rcu_read_unlock_bh();
                                return session;