]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
3881. [bug] Address memory leak with UPDATE error handling.
authorMark Andrews <marka@isc.org>
Wed, 18 Jun 2014 01:21:31 +0000 (11:21 +1000)
committerMark Andrews <marka@isc.org>
Wed, 18 Jun 2014 01:21:31 +0000 (11:21 +1000)
                        [RT #36303]

CHANGES
bin/named/update.c

diff --git a/CHANGES b/CHANGES
index 3188a6c86f0e62083f57fe248b651f34013bddeb..a02ff61d34f8c5786447bcd063b8cf91d42c9915 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+3881.  [bug]           Address memory leak with UPDATE error handling.
+                       [RT #36303]
+
 3880.  [test]          Update ans.pl to work with new TSIG support in
                        Net::DNS; add additional Net::DNS version prerequisite
                        checks. [RT #36327]
index 021b70562e1ebbcbea449a37dc428af01040b607..66a0fe166081eeaceb00adf4dc948a50d2085b96 100644 (file)
@@ -2944,10 +2944,18 @@ update_action(isc_task_t *task, isc_event_t *event) {
                                        dns_diff_clear(&ctx.del_diff);
                                        dns_diff_clear(&ctx.add_diff);
                                } else {
-                                       CHECK(do_diff(&ctx.del_diff, db, ver,
-                                                     &diff));
-                                       CHECK(do_diff(&ctx.add_diff, db, ver,
-                                                     &diff));
+                                       result = do_diff(&ctx.del_diff, db, ver,
+                                                        &diff);
+                                       if (result == ISC_R_SUCCESS) {
+                                               result = do_diff(&ctx.add_diff,
+                                                                db, ver,
+                                                                &diff);
+                                       }
+                                       if (result != ISC_R_SUCCESS) {
+                                               dns_diff_clear(&ctx.del_diff);
+                                               dns_diff_clear(&ctx.add_diff);
+                                               goto failure;
+                                       }
                                        CHECK(update_one_rr(db, ver, &diff,
                                                            DNS_DIFFOP_ADD,
                                                            name, ttl, &rdata));