From f0d061c9977d6c9bc2ddd4e6cf6ffe1ed9cd285a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Men=C5=A1=C3=ADk?= Date: Fri, 17 Jun 2022 11:40:56 +0200 Subject: [PATCH] Correct add_update_server losing first unmarked entries Beginning of servers list were updated when first server(s) record is not marked. That was a mistake, which forgot updating also up pointer to correct value. Move that loop to separate reuse_server function, which is close to similar loop in cleanup_servers. Makes it easier to compare and do correct. Removed tmp variable, because this code does not invalidate previous serv pointer. Modified for 2.86 --- src/domain-match.c | 52 ++++++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/src/domain-match.c b/src/domain-match.c index f4fd093..8409c4d 100644 --- a/src/domain-match.c +++ b/src/domain-match.c @@ -600,6 +600,34 @@ void cleanup_servers(void) build_server_array(); } +/* Upstream servers. See if there is a suitable candidate, if so unmark + and move to the end of the list, for order. The entry found may already + be at the end. */ +static struct server *reuse_server(char *alloc_domain) +{ + struct server **up, *serv; + + for (serv = daemon->servers, up = &daemon->servers; serv; serv = serv->next) + { + if ((serv->flags & SERV_MARK) && + hostname_isequal(alloc_domain, serv->domain)) + { + /* Need to move down? */ + if (serv->next) + { + struct server *s; + *up = serv->next; + for (s = daemon->servers; s->next; s = s->next); + s->next = serv; + serv->next = NULL; + } + return serv; + } + up = &serv->next; + } + return NULL; +} + int add_update_server(int flags, union mysockaddr *addr, union mysockaddr *source_addr, @@ -659,29 +687,7 @@ int add_update_server(int flags, } else { - /* Upstream servers. See if there is a suitable candidate, if so unmark - and move to the end of the list, for order. The entry found may already - be at the end. */ - struct server **up, *tmp; - - for (serv = daemon->servers, up = &daemon->servers; serv; serv = tmp) - { - tmp = serv->next; - if ((serv->flags & SERV_MARK) && - hostname_isequal(alloc_domain, serv->domain)) - { - /* Need to move down? */ - if (serv->next) - { - struct server *s; - *up = serv->next; - for (s = daemon->servers; s->next; s = s->next); - s->next = serv; - serv->next = NULL; - } - break; - } - } + serv = reuse_server(alloc_domain); if (serv) { -- 2.35.3