]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: resolvers: Don't defer resolutions release in deinit function
authorChristopher Faulet <cfaulet@haproxy.com>
Tue, 24 May 2022 16:10:42 +0000 (18:10 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Tue, 24 May 2022 16:11:59 +0000 (18:11 +0200)
resolvers_deinit() function is called on error, during post-parsing stage,
or on deinit, when HAProxy is stopped. It releases all entities: resolvers,
resolutions and SRV requests. There is no reason to defer the resolutions
release by moving them in the death_row list because this function is
terminal. And it is in fact a bug. Resolutions must not be released at the
end of the function because resolvers were already freed. However some
resolutions may still be attached to a reolver. Thus, when we try to remove
it from the resolver's tree, in resolv_reset_resolution(), this resolver was
already released.

So now, resolution are immediately released. It means there is no more
reason to track this function. calls to
enter_resolver_code()/leave_resolver_code() have been removed.

This patch should fix the issue #1680 and may be related to #1485. It must
be backported as far as 2.2.

src/resolvers.c

index c221f82c771489d2c625664c98979566b69f327d..c604c0a0c2e40f6500145056e67379c44481365e 100644 (file)
@@ -2412,7 +2412,6 @@ static void resolvers_deinit(void)
        struct resolv_requester  *req, *reqback;
        struct resolv_srvrq    *srvrq, *srvrqback;
 
-       enter_resolver_code();
        list_for_each_entry_safe(resolvers, resolversback, &sec_resolvers, list) {
                list_for_each_entry_safe(ns, nsback, &resolvers->nameservers, list) {
                        free(ns->id);
@@ -2445,7 +2444,7 @@ static void resolvers_deinit(void)
                                LIST_DEL_INIT(&req->list);
                                pool_free(resolv_requester_pool, req);
                        }
-                       abort_resolution(res);
+                       resolv_free_resolution(res);
                }
 
                list_for_each_entry_safe(res, resback, &resolvers->resolutions.wait, list) {
@@ -2453,7 +2452,7 @@ static void resolvers_deinit(void)
                                LIST_DEL_INIT(&req->list);
                                pool_free(resolv_requester_pool, req);
                        }
-                       abort_resolution(res);
+                       resolv_free_resolution(res);
                }
 
                free_proxy(resolvers->px);
@@ -2470,8 +2469,6 @@ static void resolvers_deinit(void)
                LIST_DEL_INIT(&srvrq->list);
                free(srvrq);
        }
-
-       leave_resolver_code();
 }
 
 /* Finalizes the DNS configuration by allocating required resources and checking