3278. [bug] Hold a internal reference to the zone while performing

a asynchronous load.  Address potential memory leak
                        if the asynchronous is cancelled. [RT #27750]
This commit is contained in:
Mark Andrews
2012-02-07 00:47:21 +00:00
parent f4bd753e0b
commit fc3b3e1f7e
2 changed files with 11 additions and 4 deletions
+6 -3
View File
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: zone.c,v 1.671 2012/02/03 12:59:03 marka Exp $ */
/* $Id: zone.c,v 1.672 2012/02/07 00:47:21 marka Exp $ */
/*! \file */
@@ -1711,7 +1711,7 @@ zone_asyncload(isc_task_t *task, isc_event_t *event) {
isc_event_free(&event);
if (result == ISC_R_CANCELED ||
!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_LOADPENDING))
return;
goto cleanup;
zone_load(zone, 0);
@@ -1723,7 +1723,9 @@ zone_asyncload(isc_task_t *task, isc_event_t *event) {
if (asl->loaded != NULL)
(asl->loaded)(asl->loaded_arg, zone, task);
cleanup:
isc_mem_put(zone->mctx, asl, sizeof (*asl));
dns_zone_idetach(&zone);
}
isc_result_t
@@ -1741,7 +1743,7 @@ dns_zone_asyncload(dns_zone_t *zone, dns_zt_zoneloaded_t done, void *arg) {
if (asl == NULL)
CHECK(ISC_R_NOMEMORY);
asl->zone = zone;
asl->zone = NULL;
asl->loaded = done;
asl->loaded_arg = arg;
@@ -1753,6 +1755,7 @@ dns_zone_asyncload(dns_zone_t *zone, dns_zt_zoneloaded_t done, void *arg) {
CHECK(ISC_R_NOMEMORY);
LOCK_ZONE(zone);
zone_iattach(zone, &asl->zone);
DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_LOADPENDING);
isc_task_send(zone->loadtask, &e);
UNLOCK_ZONE(zone);