ef60adb63e
Correct loop updates of up pointer. Do not lose server records prior to first marked server on update. Modified for 2.86 version. Resolves: rhbz#2061944
91 lines
2.6 KiB
Diff
91 lines
2.6 KiB
Diff
From f0d061c9977d6c9bc2ddd4e6cf6ffe1ed9cd285a Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Petr=20Men=C5=A1=C3=ADk?= <pemensik@redhat.com>
|
|
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
|
|
|