From 24a81fefe6af5a28905cbb3141698c48bce05ed8 Mon Sep 17 00:00:00 2001 From: Evan Hunt Date: Wed, 2 Nov 2022 05:55:50 -0700 Subject: [PATCH] Fix control flow issues in zone.c Since dns_master_dump() can no longer return DNS_R_CONTINUE, the error recovery code in synchronous calls to zone_dump() had branches that could no longer be reached. This has been cleaned up by using a boolean variable to determine whether the write is asynchronous rather than depending on the result code. --- lib/dns/zone.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 1380bb3b70..eab42bf8c0 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -11942,7 +11942,7 @@ static isc_result_t zone_dump(dns_zone_t *zone, bool compact) { isc_result_t result; dns_dbversion_t *version = NULL; - bool again; + bool again, async_write = false; dns_db_t *db = NULL; char *masterfile = NULL; dns_masterformat_t masterformat = dns_masterformat_none; @@ -11984,6 +11984,8 @@ redo: &zone->writeio); if (result != ISC_R_SUCCESS) { zone_idetach(&dummy); + } else { + async_write = true; } UNLOCK_ZONE(zone); } else { @@ -12013,8 +12015,12 @@ fail: } masterfile = NULL; - if (result == ISC_R_SUCCESS) { - return (ISC_R_SUCCESS); /* XXXMPA */ + if (async_write) { + /* + * Asyncronous write is in progress. Zone flags will get + * updated on completion. Cleanup is complete. We are done. + */ + return (ISC_R_SUCCESS); } again = false;