2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-31 14:35:26 +00:00

Add YAML escaping where needed

When rendering text, such as domain names or the EXTRA-TEXT
field of the EDE option, backslashes and quotation marks must
be escaped to ensure that the emitted message is valid YAML.
This commit is contained in:
Mark Andrews
2024-10-29 16:45:41 +11:00
parent e7ef4e41eb
commit 280e9b7cf4
2 changed files with 87 additions and 50 deletions

View File

@@ -679,6 +679,26 @@ if [ -x "$DIG" ]; then
if [ $ret -ne 0 ]; then echo_i "failed"; fi
status=$((status + ret))
n=$((n + 1))
echo_i "check that dig processes +ednsopt=chain:02002200 ($n)"
ret=0
dig_with_opts @10.53.0.3 +ednsopt=chain:02002200 'a.\000"' +qr >dig.out.test$n 2>&1 || ret=1
grep '; CHAIN: "\\000\\""' dig.out.test$n >/dev/null || ret=1
if [ $ret -ne 0 ]; then echo_i "failed"; fi
status=$((status + ret))
if [ $HAS_PYYAML -ne 0 ]; then
n=$((n + 1))
echo_i "check that dig processes +ednsopt=chain:02002200 +yaml ($n)"
ret=0
dig_with_opts @10.53.0.3 +yaml +ednsopt=chain:02002200 'a.\000"' +qr >dig.out.test$n 2>&1 || ret=1
$PYTHON yamlget.py dig.out.test$n 0 message query_message_data OPT_PSEUDOSECTION EDNS CHAIN >yamlget.out.test$n 2>&1 || ret=1
read -r value <yamlget.out.test$n
[ "$value" = '\000\"' ] || ret=1
if [ $ret -ne 0 ]; then echo_i "failed"; fi
status=$((status + ret))
fi
n=$((n + 1))
echo_i "check that Extended DNS Error 0 is printed correctly ($n)"
ret=0
@@ -689,6 +709,19 @@ if [ -x "$DIG" ]; then
if [ $ret -ne 0 ]; then echo_i "failed"; fi
status=$((status + ret))
if [ $HAS_PYYAML -ne 0 ]; then
n=$((n + 1))
echo_i "check that Extended DNS Error 0 is printed correctly +yaml ($n)"
ret=0
# add specials '"' and '\'
dig_with_opts @10.53.0.3 +yaml +ednsopt=ede:0000666f6f225c a.example +qr >dig.out.test$n 2>&1 || ret=1
$PYTHON yamlget.py dig.out.test$n 0 message query_message_data OPT_PSEUDOSECTION EDNS EDE EXTRA-TEXT >yamlget.out.test$n 2>&1 || ret=1
read -r value <yamlget.out.test$n
[ "$value" = 'foo"\' ] || ret=1
if [ $ret -ne 0 ]; then echo_i "failed"; fi
status=$((status + ret))
fi
n=$((n + 1))
echo_i "check that Extended DNS Error 24 is printed correctly ($n)"
ret=0

View File

@@ -3424,7 +3424,29 @@ cleanup:
}
static isc_result_t
render_nameopt(isc_buffer_t *optbuf, isc_buffer_t *target) {
put_yamlstr(isc_buffer_t *target, unsigned char *namebuf, size_t len,
bool utfok) {
isc_result_t result = ISC_R_SUCCESS;
for (size_t i = 0; i < len; i++) {
if (isprint(namebuf[i]) || (utfok && namebuf[i] > 127)) {
if (namebuf[i] == '\\' || namebuf[i] == '"') {
ADD_STRING(target, "\\");
}
if (isc_buffer_availablelength(target) < 1) {
return ISC_R_NOSPACE;
}
isc_buffer_putmem(target, &namebuf[i], 1);
} else {
ADD_STRING(target, ".");
}
}
cleanup:
return result;
}
static isc_result_t
render_nameopt(isc_buffer_t *optbuf, bool yaml, isc_buffer_t *target) {
dns_decompress_t dctx = DNS_DECOMPRESS_NEVER;
dns_fixedname_t fixed;
dns_name_t *name = dns_fixedname_initname(&fixed);
@@ -3435,7 +3457,15 @@ render_nameopt(isc_buffer_t *optbuf, isc_buffer_t *target) {
if (result == ISC_R_SUCCESS && isc_buffer_activelength(optbuf) == 0) {
dns_name_format(name, namebuf, sizeof(namebuf));
ADD_STRING(target, " \"");
if (yaml) {
result = put_yamlstr(target, (unsigned char *)namebuf,
strlen(namebuf), false);
if (result != ISC_R_SUCCESS) {
goto cleanup;
}
} else {
ADD_STRING(target, namebuf);
}
ADD_STRING(target, "\"");
return result;
}
@@ -3501,20 +3531,12 @@ render_zoneversion(dns_message_t *msg, isc_buffer_t *optbuf,
INDENT(style);
ADD_STRING(target, "ZONE: ");
if (yaml) {
char *s = namebuf;
ADD_STRING(target, "\"");
while (*s != 0) {
if (*s == '\\' || *s == '"') {
ADD_STRING(target, "\\");
}
if (isc_buffer_availablelength(target) < 1) {
result = ISC_R_NOSPACE;
put_yamlstr(target, (unsigned char *)namebuf,
strlen(namebuf), false);
if (result != ISC_R_SUCCESS) {
goto cleanup;
}
isc_buffer_putmem(target, (unsigned char *)s,
1);
s++;
}
ADD_STRING(target, "\"");
} else {
ADD_STRING(target, namebuf);
@@ -3546,16 +3568,15 @@ render_zoneversion(dns_message_t *msg, isc_buffer_t *optbuf,
ADD_STRING(target, sep2);
INDENT(style);
ADD_STRING(target, "PVALUE: \"");
put_yamlstr(target, data, len, false);
ADD_STRING(target, "\"");
} else {
ADD_STRING(target, " (\"");
}
for (size_t i = 0; i < len; i++) {
if (isprint(data[i])) {
if (yaml && (data[i] == '\\' || data[i] == '"'))
if (isc_buffer_availablelength(target) <
1)
{
ADD_STRING(target, "\\");
}
if (isc_buffer_availablelength(target) < 1) {
result = ISC_R_NOSPACE;
goto cleanup;
}
@@ -3564,9 +3585,6 @@ render_zoneversion(dns_message_t *msg, isc_buffer_t *optbuf,
ADD_STRING(target, ".");
}
}
if (yaml) {
ADD_STRING(target, "\"");
} else {
ADD_STRING(target, "\")");
}
isc_buffer_forward(optbuf, len);
@@ -3770,7 +3788,7 @@ dns_message_pseudosectiontoyaml(dns_message_t *msg, dns_pseudosection_t section,
if (optlen > 0U) {
isc_buffer_t sb = optbuf;
isc_buffer_setactive(&optbuf, optlen);
result = render_nameopt(&optbuf,
result = render_nameopt(&optbuf, true,
target);
if (result == ISC_R_SUCCESS) {
ADD_STRING(target, "\n");
@@ -3920,21 +3938,7 @@ dns_message_pseudosectiontoyaml(dns_message_t *msg, dns_pseudosection_t section,
} else {
ADD_STRING(target, "\"");
}
if (isc_buffer_availablelength(target) < optlen)
{
result = ISC_R_NOSPACE;
goto cleanup;
}
for (i = 0; i < optlen; i++) {
if (isprint(optdata[i]) ||
(utf8ok && optdata[i] > 127))
{
isc_buffer_putmem(
target, &optdata[i], 1);
} else {
isc_buffer_putstr(target, ".");
}
}
put_yamlstr(target, optdata, optlen, utf8ok);
if (!extra_text) {
ADD_STRING(target, "\")");
} else {
@@ -4179,7 +4183,7 @@ dns_message_pseudosectiontotext(dns_message_t *msg, dns_pseudosection_t section,
if (optlen > 0U) {
isc_buffer_t sb = optbuf;
isc_buffer_setactive(&optbuf, optlen);
result = render_nameopt(&optbuf,
result = render_nameopt(&optbuf, false,
target);
if (result == ISC_R_SUCCESS) {
ADD_STRING(target, "\n");