Some libunbound configuration changes can change the quality of a
resolver so we have to schedule a re-check.

OK?

diff --git resolver.c resolver.c
index feeb6c2f27a..006632e0303 100644
--- resolver.c
+++ resolver.c
@@ -175,7 +175,7 @@ void                         replace_forwarders(struct 
uw_forwarder_head *,
 void                    resolver_ref(struct uw_resolver *);
 void                    resolver_unref(struct uw_resolver *);
 int                     resolver_cmp(const void *, const void *);
-void                    restart_ub_resolvers(void);
+void                    restart_ub_resolvers(int);
 void                    show_status(pid_t);
 void                    show_autoconf(pid_t);
 void                    show_mem(pid_t);
@@ -501,7 +501,7 @@ resolver_dispatch_frontend(int fd, short event, void *bula)
                        memcpy(&verbose, imsg.data, sizeof(verbose));
                        if (log_getdebug() && (log_getverbose() & OPT_VERBOSE3)
                            != (verbose & OPT_VERBOSE3))
-                               restart_ub_resolvers();
+                               restart_ub_resolvers(0);
                        log_setverbose(verbose);
                        break;
                case IMSG_QUERY:
@@ -545,7 +545,7 @@ resolver_dispatch_frontend(int fd, short event, void *bula)
                        break;
                case IMSG_NEW_TAS_DONE:
                        if (merge_tas(&new_trust_anchors, &trust_anchors))
-                               restart_ub_resolvers();
+                               restart_ub_resolvers(1);
                        break;
                case IMSG_NETWORK_CHANGED:
                        clock_gettime(CLOCK_MONOTONIC, &last_network_change);
@@ -577,7 +577,7 @@ resolver_dispatch_frontend(int fd, short event, void *bula)
                            sizeof(new_available_afs));
                        if (new_available_afs != available_afs) {
                                available_afs = new_available_afs;
-                               restart_ub_resolvers();
+                               restart_ub_resolvers(1);
                        }
                        break;
                default:
@@ -1754,14 +1754,20 @@ resolver_cmp(const void *_a, const void *_b)
 }
 
 void
-restart_ub_resolvers(void)
+restart_ub_resolvers(int recheck)
 {
-       int      i;
+       int                      i;
+       enum uw_resolver_state   state;
 
-       for (i = 0; i < UW_RES_NONE; i++)
-               if (i != UW_RES_ASR)
-                       new_resolver(i, resolvers[i] != NULL ?
-                           resolvers[i]->state : UNKNOWN);
+       for (i = 0; i < UW_RES_NONE; i++) {
+               if (i == UW_RES_ASR)
+                       continue;
+               if (recheck || resolvers[i] == NULL)
+                       state = UNKNOWN;
+               else
+                       state = resolvers[i]->state;
+               new_resolver(i, state);
+       }
 }
 
 void

-- 
I'm not entirely sure you are real.

Reply via email to