Applied, with a small addition. cleanup_servers() may end up deleting the last server in the chain, invalidating servers_tail, so recalculate it as part of the loop there.
Cheers, Simon. On 19/09/2021 11:56, hev wrote: > Signed-off-by: hev <r...@hev.cc> > --- > src/dnsmasq.h | 2 +- > src/domain-match.c | 12 ++++-------- > 2 files changed, 5 insertions(+), 9 deletions(-) > > diff --git a/src/dnsmasq.h b/src/dnsmasq.h > index 327ad65..639c568 100644 > --- a/src/dnsmasq.h > +++ b/src/dnsmasq.h > @@ -1105,7 +1105,7 @@ extern struct daemon { > char *lease_change_command; > struct iname *if_names, *if_addrs, *if_except, *dhcp_except, *auth_peers, > *tftp_interfaces; > struct bogus_addr *bogus_addr, *ignore_addr; > - struct server *servers, *local_domains, **serverarray, *no_rebind; > + struct server *servers, *servers_tail, *local_domains, **serverarray, > *no_rebind; > int server_has_wildcard; > int serverarraysz, serverarrayhwm; > struct ipsets *ipsets; > diff --git a/src/domain-match.c b/src/domain-match.c > index 8f29621..7483782 100644 > --- a/src/domain-match.c > +++ b/src/domain-match.c > @@ -673,18 +673,14 @@ int add_update_server(int flags, > } > else > { > - struct server *s; > - > memset(serv, 0, sizeof(struct server)); > > /* Add to the end of the chain, for order */ > - if (!daemon->servers) > - daemon->servers = serv; > + if (daemon->servers_tail) > + daemon->servers_tail->next = serv; > else > - { > - for (s = daemon->servers; s->next; s = s->next); > - s->next = serv; > - } > + daemon->servers = serv; > + daemon->servers_tail = serv; > > #ifdef HAVE_LOOP > serv->uid = rand32(); > _______________________________________________ Dnsmasq-discuss mailing list Dnsmasq-discuss@lists.thekelleys.org.uk https://lists.thekelleys.org.uk/cgi-bin/mailman/listinfo/dnsmasq-discuss