From cb9ed81e6b1fdd26a06739fe819b730eb4a70839 Mon Sep 17 00:00:00 2001 From: Petr Spacek Date: Apr 09 2014 14:31:53 +0000 Subject: Prevent NULL dereference before sync_concurr_limit_signal() calls. Missing check was causing NULL dereference in case where manager_get_ldap_instance() failed. This typically happens when BIND is processing LDAP updates during shutdown. Signed-off-by: Petr Spacek --- diff --git a/NEWS b/NEWS index e787e7f..78843f2 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,8 @@ +4.3 +==== +[1] LDAP update processing was fixed to prevent BIND from crashing during + shutdown. + 4.2 ==== [1] Record parsing was fixed to prevent child-zone data corruption in cases diff --git a/src/ldap_helper.c b/src/ldap_helper.c index 678e9f8..cf8d45e 100644 --- a/src/ldap_helper.c +++ b/src/ldap_helper.c @@ -3913,16 +3913,18 @@ update_zone(isc_task_t *task, isc_event_t *event) } cleanup: - sync_concurr_limit_signal(inst->sctx); + if (inst != NULL) { + sync_concurr_limit_signal(inst->sctx); + if (dns_name_dynamic(&currname)) + dns_name_free(&currname, inst->mctx); + if (dns_name_dynamic(&prevname)) + dns_name_free(&prevname, inst->mctx); + } if (result != ISC_R_SUCCESS) log_error_r("update_zone (syncrepl) failed for '%s'. " "Zones can be outdated, run `rndc reload`", pevent->dn); - if (dns_name_dynamic(&currname)) - dns_name_free(&currname, inst->mctx); - if (dns_name_dynamic(&prevname)) - dns_name_free(&prevname, inst->mctx); isc_mem_free(mctx, pevent->dbname); if (pevent->prevdn != NULL) isc_mem_free(mctx, pevent->prevdn); @@ -3948,7 +3950,8 @@ update_config(isc_task_t *task, isc_event_t *event) CHECK(ldap_parse_configentry(entry, inst)); cleanup: - sync_concurr_limit_signal(inst->sctx); + if (inst != NULL) + sync_concurr_limit_signal(inst->sctx); if (result != ISC_R_SUCCESS) log_error_r("update_config (syncrepl) failed for '%s'. " "Configuration can be outdated, run `rndc reload`", @@ -4200,17 +4203,19 @@ cleanup: pevent->dn, pevent->chgtype); } - sync_concurr_limit_signal(inst->sctx); + if (inst != NULL) { + sync_concurr_limit_signal(inst->sctx); + if (dns_name_dynamic(&name)) + dns_name_free(&name, inst->mctx); + if (dns_name_dynamic(&prevname)) + dns_name_free(&prevname, inst->mctx); + if (dns_name_dynamic(&origin)) + dns_name_free(&origin, inst->mctx); + if (dns_name_dynamic(&prevorigin)) + dns_name_free(&prevorigin, inst->mctx); + } if (zone_ptr != NULL) dns_zone_detach(&zone_ptr); - if (dns_name_dynamic(&name)) - dns_name_free(&name, inst->mctx); - if (dns_name_dynamic(&prevname)) - dns_name_free(&prevname, inst->mctx); - if (dns_name_dynamic(&origin)) - dns_name_free(&origin, inst->mctx); - if (dns_name_dynamic(&prevorigin)) - dns_name_free(&prevorigin, inst->mctx); ldapdb_rdatalist_destroy(mctx, &rdatalist); isc_mem_free(mctx, pevent->dbname); if (pevent->prevdn != NULL)