diff --git a/CHANGES b/CHANGES index 98d1e3d11f..04e5aad1ff 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,9 @@ +6193. [bug] Fix a catz db update notification callback registration + logic error, which could crash named when receiving an + AXFR update for a catalog zone while the previous update + process of the catalog zone was already running. + [GL #4136] + 6192. [placeholder] 6191. [placeholder] diff --git a/lib/dns/catz.c b/lib/dns/catz.c index bcf887e3bb..6bff6a8e48 100644 --- a/lib/dns/catz.c +++ b/lib/dns/catz.c @@ -2147,20 +2147,23 @@ dns_catz_dbupdate_callback(dns_db_t *db, void *fn_arg) { /* New zone came as AXFR */ if (catz->db != NULL && catz->db != db) { + /* Old db cleanup. */ if (catz->dbversion != NULL) { dns_db_closeversion(catz->db, &catz->dbversion, false); } dns_db_updatenotify_unregister( catz->db, dns_catz_dbupdate_callback, catz->catzs); dns_db_detach(&catz->db); - /* - * We're not registering db update callback, it will be - * registered at the end of dns__catz_update_cb() - */ catz->db_registered = false; } if (catz->db == NULL) { + /* New db registration. */ dns_db_attach(db, &catz->db); + result = dns_db_updatenotify_register( + db, dns_catz_dbupdate_callback, catz->catzs); + if (result == ISC_R_SUCCESS) { + catz->db_registered = true; + } } if (!catz->updatepending && !catz->updaterunning) {