]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
append "0" to IPv6 addresses ending in "::" when printing YAML
authorEvan Hunt <each@isc.org>
Thu, 18 Jun 2020 00:53:07 +0000 (17:53 -0700)
committerEvan Hunt <each@isc.org>
Thu, 25 Jun 2020 23:42:13 +0000 (16:42 -0700)
such addresses broke some YAML parsers.

13 files changed:
CHANGES
bin/tests/system/digdelv/ns2/example.db.in
bin/tests/system/digdelv/tests.sh
lib/dns/rdata.c
lib/dns/rdata/generic/amtrelay_260.c
lib/dns/rdata/generic/ipseckey_45.c
lib/dns/rdata/generic/l32_105.c
lib/dns/rdata/hs_4/a_1.c
lib/dns/rdata/in_1/a6_38.c
lib/dns/rdata/in_1/a_1.c
lib/dns/rdata/in_1/aaaa_28.c
lib/dns/rdata/in_1/apl_42.c
lib/dns/rdata/in_1/wks_11.c

diff --git a/CHANGES b/CHANGES
index 79790b05a90cb7586e9c7e058f813948e4abd72e..1bfdce4f41224cf425abb4acc6cd1dfa8300e133 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,8 @@
+5447.  [bug]           IPv6 addresses ending in "::" could break YAML
+                       parsing. A "0" is now appended to such addresses
+                       in YAML output from dig, mdig, delv, and dnstap-read.
+                       [GL #1952]
+
 5446.  [bug]           The validator could fail to accept a properly signed
                        RRset if an unsupported algorithm appeared earlier in
                        the DNSKEY RRset than a supported algorithm.  It could
index 3d4e460ea93cee8e89480f8b4b94cbfcf65f7498..d69a7cb4b2f69c71b17809eb312971e2893c46ca 100644 (file)
@@ -28,6 +28,8 @@ b                     A       10.0.0.2
 b                      AAAA    fd92:7065:b8e:ffff::2
 c                      A       10.0.0.3
 c                      AAAA    fd92:7065:b8e:ffff::3
+d                      A       10.0.0.0
+d                      AAAA    fd92:7065:b8e:ffff::
 
 xn--caf-dma            A       10.1.2.3
 
index 66223bdefcb9e9aa40dd80399355c2aa3b2b276d..6930a1c8ccf82e8f8ead192500b4f7d24ac782d3 100644 (file)
@@ -907,6 +907,16 @@ if [ -x "$DIG" ] ; then
     [ "$value" = "ns2.example. IN ANY" ] || ret=1
     if [ $ret -ne 0 ]; then echo_i "failed"; fi
     status=$((status+ret))
+
+    n=$((n+1))
+    echo_i "check dig +yaml output of an IPv6 address ending in zeroes ($n)"
+    ret=0
+    dig_with_opts +qr +yaml @10.53.0.3 aaaa d.example > dig.out.test$n 2>&1 || ret=1
+    $PYTHON yamlget.py dig.out.test$n 1 message response_message_data ANSWER_SECTION 0 > yamlget.out.test$n 2>&1 || ret=1
+    read -r value < yamlget.out.test$n
+    [ "$value" = "d.example. 300 IN AAAA fd92:7065:b8e:ffff::0" ] || ret=1
+    if [ $ret -ne 0 ]; then echo_i "failed"; fi
+    status=$((status+ret))
   fi
 
   n=$((n+1))
index 7199ca58912b80be5ea25a1713eafb4be3b721ca..c8453aae5c4d31e3495a082c02a22f55ae92325c 100644 (file)
@@ -151,7 +151,7 @@ static isc_result_t
 str_totext(const char *source, isc_buffer_t *target);
 
 static isc_result_t
-inet_totext(int af, isc_region_t *src, isc_buffer_t *target);
+inet_totext(int af, uint32_t flags, isc_region_t *src, isc_buffer_t *target);
 
 static bool
 buffer_empty(isc_buffer_t *source);
@@ -1754,7 +1754,7 @@ str_totext(const char *source, isc_buffer_t *target) {
 }
 
 static isc_result_t
-inet_totext(int af, isc_region_t *src, isc_buffer_t *target) {
+inet_totext(int af, uint32_t flags, isc_region_t *src, isc_buffer_t *target) {
        char tmpbuf[64];
 
        /* Note - inet_ntop doesn't do size checking on its input. */
@@ -1765,6 +1765,22 @@ inet_totext(int af, isc_region_t *src, isc_buffer_t *target) {
                return (ISC_R_NOSPACE);
        }
        isc_buffer_putstr(target, tmpbuf);
+
+       /*
+        * An IPv6 address ending in "::" breaks YAML
+        * parsing, so append 0 in that case.
+        */
+       if (af == AF_INET6 && (flags & DNS_STYLEFLAG_YAML) != 0) {
+               isc_textregion_t tr;
+               isc_buffer_usedregion(target, (isc_region_t *)&tr);
+               if (tr.base[tr.length - 1] == ':') {
+                       if (isc_buffer_availablelength(target) == 0) {
+                               return (ISC_R_NOSPACE);
+                       }
+                       isc_buffer_putmem(target, "0", 1);
+               }
+       }
+
        return (ISC_R_SUCCESS);
 }
 
index e14215d5f7258ae482acb080b3688071a8725a65..e65717cb5a8bbc8bae45c09b9c8062b5559c4173 100644 (file)
@@ -165,10 +165,10 @@ totext_amtrelay(ARGS_TOTEXT) {
        case 0:
                break;
        case 1:
-               return (inet_totext(AF_INET, &region, target));
+               return (inet_totext(AF_INET, tctx->flags, &region, target));
 
        case 2:
-               return (inet_totext(AF_INET6, &region, target));
+               return (inet_totext(AF_INET6, tctx->flags, &region, target));
 
        case 3:
                dns_name_init(&name, NULL);
index dfbec4b716d26f0d7109ae3c70bb64b54f0d60f2..48cf39b6e89d056a8ee8542271f081cbb7ac5c35 100644 (file)
@@ -174,12 +174,12 @@ totext_ipseckey(ARGS_TOTEXT) {
                break;
 
        case 1:
-               RETERR(inet_totext(AF_INET, &region, target));
+               RETERR(inet_totext(AF_INET, tctx->flags, &region, target));
                isc_region_consume(&region, 4);
                break;
 
        case 2:
-               RETERR(inet_totext(AF_INET6, &region, target));
+               RETERR(inet_totext(AF_INET6, tctx->flags, &region, target));
                isc_region_consume(&region, 16);
                break;
 
index 2cb5007c27fd8c91ae9a6902ac6c99be077fa967..0c15e4c999aaabead00f37f5fe989989b4a5d6bb 100644 (file)
@@ -73,7 +73,7 @@ totext_l32(ARGS_TOTEXT) {
 
        RETERR(str_totext(" ", target));
 
-       return (inet_totext(AF_INET, &region, target));
+       return (inet_totext(AF_INET, tctx->flags, &region, target));
 }
 
 static inline isc_result_t
index 82403a30e35d415bdc948b4c6a03124810dab071..6a2b76a70eaa0d564a19307512d32bdfab04945a 100644 (file)
@@ -57,7 +57,7 @@ totext_hs_a(ARGS_TOTEXT) {
        UNUSED(tctx);
 
        dns_rdata_toregion(rdata, &region);
-       return (inet_totext(AF_INET, &region, target));
+       return (inet_totext(AF_INET, tctx->flags, &region, target));
 }
 
 static inline isc_result_t
index 5e3b80adba76047194989af2aabb7fc3da3a4a8d..ac721aad4cb1db9384a61b2ffa68cdff50815c0d 100644 (file)
@@ -126,7 +126,7 @@ totext_in_a6(ARGS_TOTEXT) {
                addr[octets] &= mask;
                ar.base = addr;
                ar.length = sizeof(addr);
-               RETERR(inet_totext(AF_INET6, &ar, target));
+               RETERR(inet_totext(AF_INET6, tctx->flags, &ar, target));
                isc_region_consume(&sr, 16 - octets);
        }
 
index bc34aeeba9505ce7e97aee05b59b70a3a6216012..276e03c237b9c5bdc9f0f12ed8c89254b06b333b 100644 (file)
@@ -59,7 +59,7 @@ totext_in_a(ARGS_TOTEXT) {
        UNUSED(tctx);
 
        dns_rdata_toregion(rdata, &region);
-       return (inet_totext(AF_INET, &region, target));
+       return (inet_totext(AF_INET, tctx->flags, &region, target));
 }
 
 static inline isc_result_t
index 9ac9c40e05f3c37f0d0030e2ccccc1a8ba78cec2..7b33dd08077901149fcf08a8349e75a6c80eb491 100644 (file)
@@ -75,7 +75,7 @@ totext_in_aaaa(ARGS_TOTEXT) {
                return (str_totext(buf, target));
        }
        dns_rdata_toregion(rdata, &region);
-       return (inet_totext(AF_INET6, &region, target));
+       return (inet_totext(AF_INET6, tctx->flags, &region, target));
 }
 
 static inline isc_result_t
index 0b0c48620eb44fa58b0777e663cffc4443ef5be7..dde742ca073a86150bce344ba477538e86341402 100644 (file)
@@ -154,7 +154,7 @@ totext_in_apl(ARGS_TOTEXT) {
                        INSIST(prefix <= 32);
                        memset(buf, 0, sizeof(buf));
                        memmove(buf, sr.base, len);
-                       RETERR(inet_totext(AF_INET, &ir, target));
+                       RETERR(inet_totext(AF_INET, tctx->flags, &ir, target));
                        break;
 
                case 2:
@@ -162,7 +162,7 @@ totext_in_apl(ARGS_TOTEXT) {
                        INSIST(prefix <= 128);
                        memset(buf, 0, sizeof(buf));
                        memmove(buf, sr.base, len);
-                       RETERR(inet_totext(AF_INET6, &ir, target));
+                       RETERR(inet_totext(AF_INET6, tctx->flags, &ir, target));
                        break;
 
                default:
index 942290362d6aea68afbcb409bcdbe1447ba09988..26eda5d7f60711b9a35ca70a0f267fb8a441cefe 100644 (file)
@@ -218,7 +218,7 @@ totext_in_wks(ARGS_TOTEXT) {
        REQUIRE(rdata->length >= 5);
 
        dns_rdata_toregion(rdata, &sr);
-       RETERR(inet_totext(AF_INET, &sr, target));
+       RETERR(inet_totext(AF_INET, tctx->flags, &sr, target));
        isc_region_consume(&sr, 4);
 
        proto = uint8_fromregion(&sr);