]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
4574. [bug] Dig leaked memory with multiple +subnet options.
authorMark Andrews <marka@isc.org>
Tue, 14 Feb 2017 04:52:40 +0000 (15:52 +1100)
committerMark Andrews <marka@isc.org>
Tue, 14 Feb 2017 04:52:40 +0000 (15:52 +1100)
                        [RT #44683]

CHANGES
bin/dig/dig.c
bin/dig/dighost.c
bin/tests/system/digdelv/tests.sh

diff --git a/CHANGES b/CHANGES
index a696770b443ba3636e1eabdcec6cd25854ee6b94..74036906b3e47932f7c82fd1f4b8d73ab6d384a7 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+4574.  [bug]           Dig leaked memory with multiple +subnet options.
+                       [RT #44683]
+
 4573.  [func]          Query logic has been substantially refactored (e.g.
                        query_find function has been split into smaller
                        functions) for improved readability, maintainability
index 2804a59efd870e8c3758f7f0d659cdcf10ab3a54..6e183d48f870841f9f665df32262193f0711c7e7 100644 (file)
@@ -1378,7 +1378,10 @@ plus_option(const char *option, isc_boolean_t is_batchfile,
                        }
                        if (lookup->edns == -1)
                                lookup->edns = 0;
-
+                       if (lookup->ecs_addr != NULL) {
+                               isc_mem_free(mctx, lookup->ecs_addr);
+                               lookup->ecs_addr = NULL;
+                       }
                        result = parse_netprefix(&lookup->ecs_addr, value);
                        if (result != ISC_R_SUCCESS)
                                fatal("Couldn't parse client");
index 28f7eda59f3c2a27533f4f42ab328b53f183ff2f..1030afc1f1c2cc9daaff8a3dded061531da4034c 100644 (file)
@@ -1096,6 +1096,8 @@ parse_netprefix(isc_sockaddr_t **sap, const char *value) {
        isc_boolean_t prefix_parsed = ISC_FALSE;
        char buf[sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:XXX.XXX.XXX.XXX/128")];
 
+       REQUIRE(sap != NULL && *sap == NULL);
+
        if (strlcpy(buf, value, sizeof(buf)) >= sizeof(buf))
                fatal("invalid prefix '%s'\n", value);
 
index 594f74fc9e97de13075ffcad7024ff64640fdcd0..10628f8218a66fb4ea76247e2b57243550c33628 100644 (file)
@@ -269,6 +269,14 @@ if [ -x ${DIG} ] ; then
   if [ $ret != 0 ]; then echo "I:failed"; fi
   status=`expr $status + $ret`
 
+  n=`expr $n + 1`
+  echo "I:checking dig +subnet +subnet ($n)"
+  ret=0
+  $DIG $DIGOPTS +tcp @10.53.0.2 +subnet=127.0.0.0 +subnet=127.0.0.1 A a.example > dig.out.test$n 2>&1 || ret=1
+  grep "CLIENT-SUBNET: 127.0.0.1/32/0" < dig.out.test$n > /dev/null || ret=1
+  if [ $ret != 0 ]; then echo "I:failed"; fi
+  status=`expr $status + $ret`
+
   n=`expr $n + 1`
   echo "I:checking dig +subnet with various prefix lengths ($n)"
   ret=0