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

Reply via email to