]> 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>
Fri, 26 Jun 2020 02:35:31 +0000 (19:35 -0700)
such addresses broke some YAML parsers.

(cherry picked from commit a8baf79e3345aa09928a13d76f77db7d17f4c972)

CHANGES
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 c7a8c85be2c0ca09cc2c4ddc97c2893bb2714a2e..4f8074821996fed0a5a1ea262aa40e6d74572ae1 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,7 @@
+5447.  [bug]           IPv6 addresses ending in "::" could break YAML
+                       parsing. A "0" is now appended to such addresses
+                       in YAML output from 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 e5b42c264a5b61666786e98cfb3f0f1f681fd805..084b17249a5e7fa8694d6e3a3484f16fbc7a99dc 100644 (file)
@@ -149,7 +149,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);
@@ -1725,7 +1725,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. */
@@ -1734,6 +1734,22 @@ inet_totext(int af, isc_region_t *src, isc_buffer_t *target) {
        if (strlen(tmpbuf) > isc_buffer_availablelength(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 d0e00ba59fff63e1d198ce5487127da38452685c..413a435a4e1b7a0b53ea5f344d333ec79c0855f3 100644 (file)
@@ -164,10 +164,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 95d17a3d6609de49ef650b700400f8de4f1ab267..d85f79576f19d8805dacd8fc5a6183fc3700155d 100644 (file)
@@ -164,12 +164,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 dffa96b1c04e85e996fc881e7cf57aaaf6edbb92..6dde0e8b73faa6887a26895c477c525f40b7cdb4 100644 (file)
@@ -70,7 +70,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 69a0f0bc9e803a76a609895e127d9aefcb45b15c..9d210a2f46ed9a9b8e6e206001e684169996a225 100644 (file)
@@ -54,7 +54,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 059e795bf598df27e7c971c1e51886423a27b727..1cdbe62d68aee2be868df8cd8281c0a433a1dceb 100644 (file)
@@ -121,7 +121,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 f2b909bee74dd1c3e93442f643669a6bd3e0adf1..79d37bae0ce8c1e31ec1aa379339035af41ae8d0 100644 (file)
@@ -56,7 +56,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 8d3d98f47ebf36aad2171e4e65f025e2aa7e4f27..08dacaf9fc7f6e572cab61d826eba1fa9fe31982 100644 (file)
@@ -57,7 +57,7 @@ totext_in_aaaa(ARGS_TOTEXT) {
        REQUIRE(rdata->length == 16);
 
        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 7255b6ca7cf24362bd0ab4bbce5e4a90be845ff7..f6cebc33f9aadd5a69a747ae203dcd8769c639d8 100644 (file)
@@ -142,7 +142,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:
@@ -150,7 +150,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 ed77c2f2d07c755e65727e74243b7b6d9701d332..51b16e60af3c2a09c1fb6aeaace0762cd60a4551 100644 (file)
@@ -210,7 +210,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);