]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Fix GeoIP2 memory leak upon reconfiguration
authorMichał Kępień <michal@isc.org>
Mon, 2 Dec 2019 14:15:06 +0000 (15:15 +0100)
committerMichał Kępień <michal@isc.org>
Mon, 2 Dec 2019 14:21:38 +0000 (15:21 +0100)
Loaded GeoIP2 databases are only released when named is shut down, but
not during server reconfiguration.  This causes memory to be leaked
every time "rndc reconfig" or "rndc reload" is used, as long as any
GeoIP2 database is in use.  Fix by releasing any loaded GeoIP2 databases
before reloading them.  Do not call dns_geoip_shutdown() until server
shutdown as that function releases the memory context used for caching
GeoIP2 lookup results.

(cherry picked from commit 670afbe84a87e202fa795079d9d6d1639bcf391d)

bin/named/geoip.c
bin/named/server.c

index 1610c66cea8653a46dde3623f41a4485cc50432c..38edd24ab32b0da89a74be330f1daa6f80be27f2 100644 (file)
@@ -244,6 +244,4 @@ named_geoip_shutdown(void) {
                named_g_geoip->domain = NULL;
        }
 #endif /* HAVE_GEOIP2 */
-
-       dns_geoip_shutdown();
 }
index 1961b22178c11fb8c18268f1fe0c11f6f0642e5d..78fed9f7b657f88664b9a225e5f8c099409de836 100644 (file)
@@ -70,6 +70,7 @@
 #include <dns/events.h>
 #include <dns/forward.h>
 #include <dns/fixedname.h>
+#include <dns/geoip.h>
 #include <dns/journal.h>
 #include <dns/keytable.h>
 #include <dns/keyvalues.h>
@@ -8283,6 +8284,10 @@ load_configuration(const char *filename, named_server_t *server,
        isc_socketmgr_setreserved(named_g_socketmgr, reserved);
 
 #if defined(HAVE_GEOIP) || defined(HAVE_GEOIP2)
+       /*
+        * Release any previously opened GeoIP2 databases.
+        */
+       named_geoip_shutdown();
        /*
         * Initialize GeoIP databases from the configured location.
         * This should happen before configuring any ACLs, so that we
@@ -9655,6 +9660,7 @@ shutdown_server(isc_task_t *task, isc_event_t *event) {
 #endif
 #if defined(HAVE_GEOIP) || defined(HAVE_GEOIP2)
        named_geoip_shutdown();
+       dns_geoip_shutdown();
 #endif /* HAVE_GEOIP || HAVE_GEOIP2 */
 
        dns_db_detach(&server->in_roothints);