[Freeipa-devel] [PATCH 0022] fix crash during zone unload when NS is not resolvable
Adam Tkac
atkac at redhat.com
Thu Jun 7 15:31:38 UTC 2012
On Thu, Jun 07, 2012 at 03:33:18PM +0200, Petr Spacek wrote:
> Hello,
>
> this patch fixes https://fedorahosted.org/bind-dyndb-ldap/ticket/77:
> bind-dyndb-ldap crashes during zone unload when NS is not
> resolvable.
>
> During investigation I found other two suspicious places. This patch
> adds only comment near to them. Any changes (as necessary) will be
> in separate patch.
Thanks, pushed to master.
> From 970984bc84556ac1355de9f67eb4de20c823f4ce Mon Sep 17 00:00:00 2001
> From: Petr Spacek <pspacek at redhat.com>
> Date: Thu, 7 Jun 2012 15:27:27 +0200
> Subject: [PATCH] Fix crash during zone unload when NS is not resolvable.
> https://fedorahosted.org/bind-dyndb-ldap/ticket/77
> Signed-off-by: Petr Spacek <pspacek at redhat.com>
>
> ---
> src/ldap_helper.c | 11 +++++++++--
> 1 files changed, 9 insertions(+), 2 deletions(-)
>
> diff --git a/src/ldap_helper.c b/src/ldap_helper.c
> index 5965d30e51fa50fcb4b38d35e023a529fd6a121f..a1ef9a27e5d1b031a53e779d58b7490bd3d41d05 100644
> --- a/src/ldap_helper.c
> +++ b/src/ldap_helper.c
> @@ -30,6 +30,7 @@
> #include <dns/ttl.h>
> #include <dns/view.h>
> #include <dns/zone.h>
> +#include <dns/db.h>
> #include <dns/zt.h>
> #include <dns/byaddr.h>
> #include <dns/forward.h>
> @@ -788,7 +789,12 @@ ldap_delete_zone2(ldap_instance_t *inst, dns_name_t *name, isc_boolean_t lock)
> freeze = ISC_TRUE;
> }
>
> - dns_zone_unload(zone);
> + /* Do not unload partially loaded zones, they have incomplete structures. */
> + dns_db_t *dbp = NULL;
> + if (dns_zone_getdb(zone,&dbp) != DNS_R_NOTLOADED) {
> + dns_db_detach(&dbp); /* dns_zone_getdb() attaches DB implicitly */
> + dns_zone_unload(zone);
> + }
> CHECK(dns_zt_unmount(inst->view->zonetable, zone));
> CHECK(zr_del_zone(inst->zone_register, name));
> dns_zonemgr_releasezone(inst->zmgr, zone);
> @@ -1013,7 +1019,7 @@ ldap_parse_zoneentry(ldap_entry_t *entry, ldap_instance_t *inst)
>
> /* Check if we are already serving given zone */
> result = zr_get_zone_ptr(inst->zone_register, &name, &zone);
> - if (result != ISC_R_SUCCESS) {
> + if (result != ISC_R_SUCCESS) { /* TODO: What about other errors? */
> CHECK(create_zone(inst, &name, &zone));
> CHECK(zr_add_zone(inst->zone_register, zone, dn));
> publish = ISC_TRUE;
> @@ -2760,6 +2766,7 @@ update_action(isc_task_t *task, isc_event_t *event)
> mctx = pevent->mctx;
>
> result = manager_get_ldap_instance(pevent->dbname, &inst);
> + /* TODO: Can it happen? */
> if (result != ISC_R_SUCCESS)
> goto cleanup;
>
> --
> 1.7.7.6
>
--
Adam Tkac, Red Hat, Inc.
More information about the Freeipa-devel
mailing list