]> 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:25:20 +0000 (11:25 +1000)
                        [RT #36303]

(cherry picked from commit f5bb5eb7f6640af4a94e666bf1d7f84a6a7f1f23)

CHANGES
bin/named/update.c

diff --git a/CHANGES b/CHANGES
index 1ecfea2aa452eb4dd1f2968962515d18142f16c3..8756a229763646a99dd1c20605e7c0bff0e95bbe 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 c5d3495a91c34250b0463d1c9cabbdb511457c52..c26433342573dcd58ca7acd1cf3d3bc27f0f163c 100644 (file)
@@ -2917,10 +2917,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));