summaryrefslogtreecommitdiffstats
path: root/kernel/bpf/lpm_trie.c
diff options
context:
space:
mode:
authorFlorian Lehner <dev@der-flo.net>2023-11-05 09:58:01 +0100
committerAlexei Starovoitov <ast@kernel.org>2023-11-09 19:07:38 -0800
commit9b75dbeb36fcd9fc7ed51d370310d0518a387769 (patch)
treed7a194a3c697a90c9b404db8c9f4d000c00021de /kernel/bpf/lpm_trie.c
parentf2d2c7e1b7c9e8847478769d6e1f8a76b5e91952 (diff)
downloadlinux-stable-9b75dbeb36fcd9fc7ed51d370310d0518a387769.tar.gz
linux-stable-9b75dbeb36fcd9fc7ed51d370310d0518a387769.tar.bz2
linux-stable-9b75dbeb36fcd9fc7ed51d370310d0518a387769.zip
bpf, lpm: Fix check prefixlen before walking trie
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>
Diffstat (limited to 'kernel/bpf/lpm_trie.c')
-rw-r--r--kernel/bpf/lpm_trie.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/kernel/bpf/lpm_trie.c b/kernel/bpf/lpm_trie.c
index 17c7e7782a1f..b32be680da6c 100644
--- a/kernel/bpf/lpm_trie.c
+++ b/kernel/bpf/lpm_trie.c
@@ -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());