such addresses broke some YAML parsers.
+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
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
[ "$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))
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);
}
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. */
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);
}
case 0:
break;
case 1:
- return (inet_totext(AF_INET, ®ion, target));
+ return (inet_totext(AF_INET, tctx->flags, ®ion, target));
case 2:
- return (inet_totext(AF_INET6, ®ion, target));
+ return (inet_totext(AF_INET6, tctx->flags, ®ion, target));
case 3:
dns_name_init(&name, NULL);
break;
case 1:
- RETERR(inet_totext(AF_INET, ®ion, target));
+ RETERR(inet_totext(AF_INET, tctx->flags, ®ion, target));
isc_region_consume(®ion, 4);
break;
case 2:
- RETERR(inet_totext(AF_INET6, ®ion, target));
+ RETERR(inet_totext(AF_INET6, tctx->flags, ®ion, target));
isc_region_consume(®ion, 16);
break;
RETERR(str_totext(" ", target));
- return (inet_totext(AF_INET, ®ion, target));
+ return (inet_totext(AF_INET, tctx->flags, ®ion, target));
}
static inline isc_result_t
UNUSED(tctx);
dns_rdata_toregion(rdata, ®ion);
- return (inet_totext(AF_INET, ®ion, target));
+ return (inet_totext(AF_INET, tctx->flags, ®ion, target));
}
static inline isc_result_t
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);
}
UNUSED(tctx);
dns_rdata_toregion(rdata, ®ion);
- return (inet_totext(AF_INET, ®ion, target));
+ return (inet_totext(AF_INET, tctx->flags, ®ion, target));
}
static inline isc_result_t
return (str_totext(buf, target));
}
dns_rdata_toregion(rdata, ®ion);
- return (inet_totext(AF_INET6, ®ion, target));
+ return (inet_totext(AF_INET6, tctx->flags, ®ion, target));
}
static inline isc_result_t
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:
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:
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);