]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
named crashes on shutdown after load rpz failed
authorMatthijs Mekking <matthijs@isc.org>
Thu, 7 Feb 2019 14:25:28 +0000 (15:25 +0100)
committerMatthijs Mekking <github@pletterpet.nl>
Fri, 22 Feb 2019 14:23:33 +0000 (15:23 +0100)
This may happen when loading an RPZ failed and the code path skips
calling dns_db_endload().  The dns_rpz_zone_t object is still kept
marked as having registered db.  So when this object is finally
destroyed in rpz_detach(), this code will incorrectly call
`dns_db_updatenotify_unregister()`:

   if (rpz->db_registered)
     dns_db_updatenotify_unregister(rpz->db,
                                    dns_rpz_dbupdate_callback, rpz);

and trigger this assertion failure:

   REQUIRE(db != NULL);

To fix this, only call `dns_db_updatenotify_unregister()` when
`rpz->db` is not NULL.

lib/dns/rpz.c
lib/dns/zone.c

index e3b2f25698893c58a61d9e3ff899d93385bb0af3..d7112b01ed5613f1f8da795d3f379527dd83e28f 100644 (file)
@@ -1586,7 +1586,6 @@ dns_rpz_dbupdate_callback(dns_db_t *db, void *fn_arg) {
        LOCK(&zone->rpzs->maint_lock);
        REQUIRE(zone->db_registered);
 
-
        /* New zone came as AXFR */
        if (zone->db != NULL && zone->db != db) {
                /* We need to clean up the old DB */
@@ -2097,14 +2096,14 @@ rpz_detach(dns_rpz_zone_t **rpzp, dns_rpz_zones_t *rpzs) {
        if (dns_name_dynamic(&rpz->cname)) {
                dns_name_free(&rpz->cname, rpzs->mctx);
        }
-       if (rpz->db_registered) {
-               dns_db_updatenotify_unregister(rpz->db,
-                                              dns_rpz_dbupdate_callback, rpz);
-       }
        if (rpz->dbversion != NULL) {
                dns_db_closeversion(rpz->db, &rpz->dbversion, false);
        }
        if (rpz->db != NULL) {
+               if (rpz->db_registered) {
+                       dns_db_updatenotify_unregister(
+                               rpz->db, dns_rpz_dbupdate_callback, rpz);
+               }
                dns_db_detach(&rpz->db);
        }
        if (rpz->updaterunning) {
index f2087658c8ab7c04b1f371272f54bc674c519c6f..5e6988cfdf11f18810375ad22c4ebe7cf01ae813 100644 (file)
@@ -2120,7 +2120,7 @@ zone_load(dns_zone_t *zone, unsigned int flags, bool locked) {
                }
        }
 
-       if (! dns_db_ispersistent(db)) {
+       if (!dns_db_ispersistent(db)) {
                if (zone->masterfile != NULL) {
                        result = zone_startload(db, zone, loadtime);
                } else {