bpf, lpm: Fix check prefixlen before walking trie
authorFlorian Lehner <dev@der-flo.net>
Sun, 5 Nov 2023 08:58:01 +0000 (09:58 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 25 Jan 2024 23:35:19 +0000 (15:35 -0800)
[ Upstream commit 9b75dbeb36fcd9fc7ed51d370310d0518a387769 ]

When looking up an element in LPM trie, the condition 'matchlen ==
trie->max_prefixlen' will never return true, if key->prefixlen is larger
than trie->max_prefixlen. Consequently all elements in the LPM trie will
be visited and no element is returned in the end.

To resolve this, check key->prefixlen first before walking the LPM trie.

Fixes: b95a5c4db09b ("bpf: add a longest prefix match trie map implementation")
Signed-off-by: Florian Lehner <dev@der-flo.net>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20231105085801.3742-1-dev@der-flo.net
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
kernel/bpf/lpm_trie.c

index 17c7e77..b32be68 100644 (file)
@@ -231,6 +231,9 @@ static void *trie_lookup_elem(struct bpf_map *map, void *_key)
        struct lpm_trie_node *node, *found = NULL;
        struct bpf_lpm_trie_key *key = _key;
 
+       if (key->prefixlen > trie->max_prefixlen)
+               return NULL;
+
        /* Start walking the trie from the root node ... */
 
        for (node = rcu_dereference_check(trie->root, rcu_read_lock_bh_held());