} state;
};
+static void
+dns_update_state_clear_contents(dns_update_state_t *state) {
+ REQUIRE(DNS_STATE_VALID(state));
+
+ dns_diff_clear(&state->sig_diff);
+ dns_diff_clear(&state->nsec_diff);
+ dns_diff_clear(&state->nsec_mindiff);
+
+ dns_diff_clear(&state->affected);
+ dns_diff_clear(&state->diffnames);
+ dns_diff_clear(&state->work);
+
+ for (size_t i = 0; i < state->nkeys; i++) {
+ dst_key_free(&state->zone_keys[i]);
+ }
+}
+
static uint32_t
dns__jitter_expire(dns_zone_t *zone) {
/* Spread out signatures over time */
dns_db_detachnode(&node);
}
- dns_update_state_clear(&state, state != &mystate);
+ if (state == &mystate) {
+ dns_update_state_clear_contents(state);
+ } else {
+ dns_update_state_t *state_to_clear = state;
+ dns_update_state_clear(&state_to_clear);
+ }
SET_IF_NOT_NULL(statep, NULL);
return result;
}
void
-dns_update_state_clear(dns_update_state_t **statep, bool destroy) {
- REQUIRE(DNS_STATE_VALID(*statep));
-
- dns_update_state_t *state = *statep;
-
- dns_diff_clear(&state->sig_diff);
- dns_diff_clear(&state->nsec_diff);
- dns_diff_clear(&state->nsec_mindiff);
-
- dns_diff_clear(&state->affected);
- dns_diff_clear(&state->diffnames);
- dns_diff_clear(&state->work);
+dns_update_state_clear(dns_update_state_t **statep) {
+ dns_update_state_t *state = NULL;
- for (size_t i = 0; i < state->nkeys; i++) {
- dst_key_free(&state->zone_keys[i]);
+ if (statep == NULL || *statep == NULL) {
+ return;
}
- if (destroy) {
- *statep = NULL;
- state->magic = 0;
- isc_mem_putanddetach(&state->mctx, state, sizeof(*state));
- }
+ state = *statep;
+ dns_update_state_clear_contents(state);
+
+ *statep = NULL;
+ state->magic = 0;
+ isc_mem_putanddetach(&state->mctx, state, sizeof(*state));
}
static isc_stdtime_t
}
if (zone->rss_state != NULL) {
- dns_update_state_clear(&zone->rss_state, true);
+ dns_update_state_clear(&zone->rss_state);
}
if (zone->masterfile != NULL) {
dns_db_t *rss_db = NULL;
dns_dbversion_t *rss_oldver = NULL;
dns_dbversion_t *rss_newver = NULL;
+ dns_update_state_t *rss_state = NULL;
REQUIRE(DNS_ZONE_VALID(zone));
LOCK_ZONE(zone);
- if (zone->rss_zone == NULL) {
+ if (zone->rss_zone == NULL && zone->rss_state == NULL) {
UNLOCK_ZONE(zone);
return;
}
rss_db = MOVE_OWNERSHIP(zone->rss_db);
rss_oldver = MOVE_OWNERSHIP(zone->rss_oldver);
rss_newver = MOVE_OWNERSHIP(zone->rss_newver);
+ rss_state = MOVE_OWNERSHIP(zone->rss_state);
zone->rss_end = 0;
dns_diff_clear(&zone->rss_diff);
UNLOCK_ZONE(zone);
+ dns_update_state_clear(&rss_state);
if (rss_db != NULL) {
if (rss_oldver != NULL) {
dns_db_closeversion(rss_db, &rss_oldver, false);
if (rss_raw != NULL) {
dns_zone_detach(&rss_raw);
}
- dns_zone_idetach(&rss_zone);
+ if (rss_zone != NULL) {
+ dns_zone_idetach(&rss_zone);
+ }
}
static void