4553. [bug] Named could deadlock there were multiple changes to

NSEC/NSEC3 parameters for a zone being processed at
                        the same time. [RT #42770]

(cherry picked from commit d2e1b47d4f)
This commit is contained in:
Mark Andrews 2017-01-12 14:25:45 +11:00
parent e1e980e7ba
commit 63fb01bb78
4 changed files with 26 additions and 8 deletions

View file

@ -1,3 +1,7 @@
4553. [bug] Named could deadlock there were multiple changes to
NSEC/NSEC3 parameters for a zone being processed at
the same time. [RT #42770]
4552. [bug] Named could trigger a assertion when sending notify
messages. [RT #44019]

View file

@ -152,6 +152,13 @@
<section xml:id="relnotes_bugs"><info><title>Bug Fixes</title></info>
<itemizedlist>
<listitem>
<para>
Named could deadlock there were multiple changes to
NSEC/NSEC3 parameters for a zone being processed at the
same time. [RT #42770]
</para>
</listitem>
<listitem>
<para>
Named could trigger a assertion when sending notify

View file

@ -9186,6 +9186,9 @@ dbiterator_first(dns_dbiterator_t *iterator) {
rbtdbiter->result = result;
if (result != ISC_R_SUCCESS)
ENSURE(!rbtdbiter->paused);
return (result);
}

View file

@ -7380,6 +7380,9 @@ zone_nsec3chain(dns_zone_t *zone) {
nsec3chain->save_delete_nsec = nsec3chain->delete_nsec;
}
if (nsec3chain != NULL)
goto skip_removals;
/*
* Process removals.
*/
@ -7587,6 +7590,7 @@ zone_nsec3chain(dns_zone_t *zone) {
first = ISC_TRUE;
}
skip_removals:
/*
* We may need to update the NSEC/NSEC3 records for the zone apex.
*/
@ -7649,9 +7653,6 @@ zone_nsec3chain(dns_zone_t *zone) {
}
}
if (nsec3chain != NULL)
dns_dbiterator_pause(nsec3chain->dbiterator);
/*
* Add / update signatures for the NSEC3 records.
*/
@ -8364,6 +8365,14 @@ zone_sign(dns_zone_t *zone) {
}
failure:
/*
* Pause all dbiterators.
*/
for (signing = ISC_LIST_HEAD(zone->signing);
signing != NULL;
signing = ISC_LIST_NEXT(signing, link))
dns_dbiterator_pause(signing->dbiterator);
/*
* Rollback the cleanup list.
*/
@ -8376,11 +8385,6 @@ zone_sign(dns_zone_t *zone) {
signing = ISC_LIST_HEAD(cleanup);
}
for (signing = ISC_LIST_HEAD(zone->signing);
signing != NULL;
signing = ISC_LIST_NEXT(signing, link))
dns_dbiterator_pause(signing->dbiterator);
dns_diff_clear(&_sig_diff);
for (i = 0; i < nkeys; i++)