From 98c7a506b7978fd339c9ca05938c45630813878b Mon Sep 17 00:00:00 2001
From: Lubos Slovak <lubos.slovak@nic.cz>
Date: Mon, 2 Sep 2013 13:49:00 +0200
Subject: [PATCH] Added cleanup after DNSSEC chgset application.

Fixed leaks from load signing. Other cases must be checked.

refs #4
---
 src/knot/server/zones.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/src/knot/server/zones.c b/src/knot/server/zones.c
index 9a65f1cc1..0d959cbe9 100644
--- a/src/knot/server/zones.c
+++ b/src/knot/server/zones.c
@@ -1436,6 +1436,10 @@ static int zones_insert_zone(conf_zone_t *z, knot_zone_t **dst,
 			ret = xfrin_apply_changesets(zone, sec_chs,
 			                             &new_contents);
 			if (ret != KNOT_EOK) {
+				// Cleanup old and new contents
+				xfrin_rollback_update(zone->contents,
+				                      &new_contents,
+				                      sec_chs->changes);
 				zones_free_merged_changesets(diff_chs, sec_chs);
 				rcu_read_unlock();
 				return ret;
@@ -1448,6 +1452,10 @@ static int zones_insert_zone(conf_zone_t *z, knot_zone_t **dst,
 			ret = xfrin_switch_zone(zone, new_contents,
 			                        XFR_TYPE_DNSSEC);
 			if (ret != KNOT_EOK) {
+				// Cleanup old and new contents
+				xfrin_rollback_update(zone->contents,
+				                      &new_contents,
+				                      sec_chs->changes);
 				zones_free_merged_changesets(diff_chs, sec_chs);
 				rcu_read_unlock();
 				return ret;
@@ -1455,6 +1463,7 @@ static int zones_insert_zone(conf_zone_t *z, knot_zone_t **dst,
 		} else if (diff_chs == NULL ||
 		           knot_changeset_is_empty(HEAD(diff_chs->sets))) {
 			// No changes
+			/*! \todo Is this really an error? */
 			ret = KNOT_ENODIFF;
 		}
 		
@@ -1465,6 +1474,7 @@ static int zones_insert_zone(conf_zone_t *z, knot_zone_t **dst,
 			free(zname);
 		}
 
+		xfrin_cleanup_successful_update(sec_chs->changes);
 		zones_free_merged_changesets(diff_chs, sec_chs);
 		rcu_read_unlock();
 	}
-- 
GitLab