Florian Obser([email protected]) on 2021.07.23 20:27:40 +0200:
> We store a list of resolver strategies in order of their preference in
> the configuration struct. This is also an implicit list of enabled
> resolver strategies. We have also stored an explict lookup array of
> enabled strategies outside of the configuration to be able to
> quickly answer "is this strategy enabled" without traversing the
> preferences list.
> 
> Move this table into the configuration so that we don't need to
> "repair" it on config reload.
> 
> This fixes a bug where on startup the preferences list and enabled
> lookup table were not in sync.
> 
> OK?

ok

> 
> diff --git parse.y parse.y
> index 5fb796655b8..65e8af2deff 100644
> --- parse.y
> +++ parse.y
> @@ -192,7 +192,11 @@ block_list               : BLOCK LIST STRING log {
>                       }
>                       ;
>  
> -uw_pref                      : PREFERENCE { conf->res_pref.len = 0; } 
> pref_block
> +uw_pref                      : PREFERENCE {
> +                             conf->res_pref.len = 0;
> +                             memset(conf->enabled_resolvers, 0,
> +                                 sizeof(conf->enabled_resolvers));
> +                     } pref_block
>                       ;
>  
>  pref_block           : '{' optnl prefopts_l '}'
> @@ -211,6 +215,7 @@ prefoptsl         : prefopt {
>                                       YYERROR;
>                               }
>                               conf->res_pref.types[conf->res_pref.len++] = $1;
> +                             conf->enabled_resolvers[$1] = 1;
>                       }
>                       ;
>  
> diff --git resolver.c resolver.c
> index 81610f68b3e..06f09604f6e 100644
> --- resolver.c
> +++ resolver.c
> @@ -211,7 +211,6 @@ static struct imsgev              *iev_frontend;
>  static struct imsgev         *iev_main;
>  struct uw_forwarder_head      autoconf_forwarder_list;
>  struct uw_resolver           *resolvers[UW_RES_NONE];
> -int                           enabled_resolvers[UW_RES_NONE];
>  struct timespec                       last_network_change;
>  
>  struct event                  trust_anchor_timer;
> @@ -672,10 +671,6 @@ resolver_dispatch_main(int fd, short event, void *bula)
>                                   "IMSG_RECONF_CONF", __func__);
>                       restart = resolvers_to_restart(resolver_conf, nconf);
>                       merge_config(resolver_conf, nconf);
> -                     memset(enabled_resolvers, 0, sizeof(enabled_resolvers));
> -                     for (i = 0; i < resolver_conf->res_pref.len; i++)
> -                             enabled_resolvers[
> -                                 resolver_conf->res_pref.types[i]] = 1;
>                       nconf = NULL;
>                       for (i = 0; i < UW_RES_NONE; i++)
>                               if (restart[i])
> @@ -1088,7 +1083,7 @@ new_resolver(enum uw_resolver_type type, enum 
> uw_resolver_state state)
>       free_resolver(resolvers[type]);
>       resolvers[type] = NULL;
>  
> -     if (!enabled_resolvers[type])
> +     if (!resolver_conf->enabled_resolvers[type])
>               return;
>  
>       switch (type) {
> @@ -2162,8 +2157,6 @@ int *
>  resolvers_to_restart(struct uw_conf *oconf, struct uw_conf *nconf)
>  {
>       static int       restart[UW_RES_NONE];
> -     int              o_enabled[UW_RES_NONE];
> -     int              n_enabled[UW_RES_NONE];
>       int              i;
>  
>       memset(&restart, 0, sizeof(restart));
> @@ -2176,16 +2169,9 @@ resolvers_to_restart(struct uw_conf *oconf, struct 
> uw_conf *nconf)
>           &nconf->uw_dot_forwarder_list)) {
>               restart[UW_RES_DOT] = 1;
>       }
> -     memset(o_enabled, 0, sizeof(o_enabled));
> -     memset(n_enabled, 0, sizeof(n_enabled));
> -     for (i = 0; i < oconf->res_pref.len; i++)
> -             o_enabled[oconf->res_pref.types[i]] = 1;
> -
> -     for (i = 0; i < nconf->res_pref.len; i++)
> -             n_enabled[nconf->res_pref.types[i]] = 1;
>  
>       for (i = 0; i < UW_RES_NONE; i++) {
> -             if (n_enabled[i] != o_enabled[i])
> +             if (oconf->enabled_resolvers[i] != nconf->enabled_resolvers[i])
>                       restart[i] = 1;
>       }
>       return restart;
> diff --git unwind.c unwind.c
> index 4697767ac34..9531cf18a08 100644
> --- unwind.c
> +++ unwind.c
> @@ -694,6 +694,7 @@ config_new_empty(void)
>           UW_RES_DHCP,
>           UW_RES_ASR};
>       struct uw_conf                  *xconf;
> +     int                              i;
>  
>       xconf = calloc(1, sizeof(*xconf));
>       if (xconf == NULL)
> @@ -702,6 +703,8 @@ config_new_empty(void)
>       memcpy(&xconf->res_pref.types, &default_res_pref,
>           sizeof(default_res_pref));
>       xconf->res_pref.len = nitems(default_res_pref);
> +     for (i = 0; i < xconf->res_pref.len; i++)
> +             xconf->enabled_resolvers[xconf->res_pref.types[i]] = 1;
>  
>       TAILQ_INIT(&xconf->uw_forwarder_list);
>       TAILQ_INIT(&xconf->uw_dot_forwarder_list);
> diff --git unwind.h unwind.h
> index 59379a4ba99..6ac05bacc91 100644
> --- unwind.h
> +++ unwind.h
> @@ -154,6 +154,7 @@ struct uw_conf {
>       struct uw_forwarder_head         uw_dot_forwarder_list;
>       struct force_tree                force;
>       struct resolver_preference       res_pref;
> +     int                              enabled_resolvers[UW_RES_NONE];
>       char                            *blocklist_file;
>       int                              blocklist_log;
>  };
> 
> -- 
> I'm not entirely sure you are real.
> 

Reply via email to