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

(cherry picked from commit f5bb5eb7f6640af4a94e666bf1d7f84a6a7f1f23)

CHANGES
bin/named/update.c

diff --git a/CHANGES b/CHANGES
index 808e3b29e81a727b44e13e053b22bbc250447729..36f118f56d9fb32844622106c004c03cbc5b450f 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 4fd095231881c845d1f8a909aa563c1100575ea5..1ae763796b3491d380520fca3627d5a893de8e21 100644 (file)
@@ -4018,10 +4018,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));