From c286c51a9bd931d023a55988c0e89574ee6d8ffa Mon Sep 17 00:00:00 2001 From: =?utf8?q?Martin=20R=C3=B6der?= Date: Wed, 18 Oct 2023 18:32:34 +0200 Subject: [PATCH] Fix AVL tree traversal in cache_record_find and cache_host_is_known MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The AVL tree traversal in both functions systematically misses the last AVL tree element. This can lead to duplicate cache entries and lookup failures. The fix duplicates the correct AVL tree traversal approach of cache_dump_recursive(). Signed-off-by: Martin Röder Signed-off-by: Felix Fietkau --- cache.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/cache.c b/cache.c index 8c851a3..0ed52d7 100644 --- a/cache.c +++ b/cache.c @@ -197,13 +197,10 @@ cache_record_find(char *record, int type, int port, int rdlength, uint8_t *rdata { struct cache_record *l = avl_find_element(&records, record, l, avl); - if (!l) - return NULL; - - while (l && !avl_is_last(&records, &l->avl) && !strcmp(l->record, record)) { + while (l && !strcmp(l->record, record)) { struct cache_record *r = l; - l = avl_next_element(l, avl); + l = !avl_is_last(&records, &l->avl) ? avl_next_element(l, avl) : NULL; if (r->type != type) continue; @@ -233,13 +230,10 @@ cache_host_is_known(char *record) { struct cache_record *l = avl_find_element(&records, record, l, avl); - if (!l) - return 0; - - while (l && !avl_is_last(&records, &l->avl) && !strcmp(l->record, record)) { + while (l && !strcmp(l->record, record)) { struct cache_record *r = l; - l = avl_next_element(l, avl); + l = !avl_is_last(&records, &l->avl) ? avl_next_element(l, avl) : NULL; if ((r->type != TYPE_A) && (r->type != TYPE_AAAA)) continue; return 1; -- 2.30.2