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.
>