From f1f863dd8185ef70840848fc7f563bfe3bdd90e6 Mon Sep 17 00:00:00 2001 From: Aram Sargsyan Date: Mon, 25 Sep 2023 09:38:03 +0000 Subject: [PATCH] Fix error path issue in xfrin_xmlrender() The TRY0 macro doesn't set the 'result' variable, so the error log message is never printed. Remove the 'result' variable and modify the function's control flow to be similar to the the zone_xmlrender() function, with a separate error returning path. --- bin/named/statschannel.c | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/bin/named/statschannel.c b/bin/named/statschannel.c index f44eddce71..94c97da1e1 100644 --- a/bin/named/statschannel.c +++ b/bin/named/statschannel.c @@ -1454,7 +1454,6 @@ cleanup: static isc_result_t xfrin_xmlrender(dns_zone_t *zone, void *arg) { - isc_result_t result; char buf[1024 + 32]; /* sufficiently large for zone name and class */ dns_rdataclass_t rdclass; const char *ztype; @@ -1479,23 +1478,30 @@ xfrin_xmlrender(dns_zone_t *zone, void *arg) { return (ISC_R_SUCCESS); } - result = dns_zone_getxfr(zone, &xfr, &is_running, &is_deferred, - &is_presoa, &is_pending, &needs_refresh); - if (result != ISC_R_SUCCESS) { - result = ISC_R_SUCCESS; - goto cleanup; + if (dns_zone_getxfr(zone, &xfr, &is_running, &is_deferred, &is_presoa, + &is_pending, &needs_refresh) != ISC_R_SUCCESS) + { + /* + * Failed to get information about the zone's incoming transfer + * (if any), but we still want to continue generating the + * remaining parts of the output. + */ + return (ISC_R_SUCCESS); } if (!is_running && !is_deferred && !is_presoa && !is_pending && !needs_refresh) { + if (xfr != NULL) { + dns_xfrin_detach(&xfr); + } /* No ongoing/queued transfer. */ - goto cleanup; + return (ISC_R_SUCCESS); } if (is_running && xfr == NULL) { /* The transfer is finished, and it's shutting down. */ - goto cleanup; + return (ISC_R_SUCCESS); } TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "xfrin")); @@ -1696,16 +1702,22 @@ xfrin_xmlrender(dns_zone_t *zone, void *arg) { TRY0(xmlTextWriterEndElement(writer)); /* xfrin */ + if (xfr != NULL) { + dns_xfrin_detach(&xfr); + } + + return (ISC_R_SUCCESS); + cleanup: if (xfr != NULL) { dns_xfrin_detach(&xfr); } - if (result != ISC_R_SUCCESS) { - isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL, - NAMED_LOGMODULE_SERVER, ISC_LOG_ERROR, - "Failed at xfrin_xmlrender()"); - } - return (result); + + isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL, + NAMED_LOGMODULE_SERVER, ISC_LOG_ERROR, + "Failed at xfrin_xmlrender()"); + + return (ISC_R_FAILURE); } static isc_result_t