Add +yaml support for EDE

This commit is contained in:
Mark Andrews
2020-05-13 14:37:41 +10:00
parent e85bb7b85d
commit 0ec77c2b92
4 changed files with 133 additions and 26 deletions

View File

@@ -11,9 +11,10 @@
set -e
rm -f ./*/anchor.*
rm -f ./*/named.conf
rm -f ./*/named.memstats
rm -f ./*/named.run
rm -f ./*/named.conf
rm -f ./delv.out.test*
rm -f ./dig.out.*test*
rm -f ./dig.out.mm.*
@@ -21,9 +22,9 @@ rm -f ./dig.out.mn.*
rm -f ./dig.out.nm.*
rm -f ./dig.out.nn.*
rm -f ./host.out.test*
rm -f ./nslookup.out.test*
rm -f ./ns*/named.lock
rm -f ./ns*/managed-keys.bind*
rm -f ./ns2/example.db ./ns2/K* ./ns2/keyid ./ns2/keydata
rm -f ./*/anchor.*
rm -f ./ns*/named.lock
rm -f ./ns2/dsset-example.
rm -f ./ns2/example.db ./ns2/K* ./ns2/keyid ./ns2/keydata
rm -f ./nslookup.out.test*
rm -f ./yamlget.out.*

View File

@@ -708,6 +708,65 @@ 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 +yaml Extended DNS Error 0 is printed correctly ($n)"
# First defined EDE code, additional text "foo".
dig_with_opts @10.53.0.3 +yaml +ednsopt=ede:0000666f6f 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 INFO-CODE > yamlget.out.test$n 2>&1 || ret=1
read -r value < yamlget.out.test$n
[ "$value" = "0 (Other)" ] || 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))
n=$((n+1))
echo_i "check that +yaml Extended DNS Error 24 is printed correctly ($n)"
# Last defined EDE code, no additional text.
dig_with_opts @10.53.0.3 +yaml +ednsopt=ede:0018 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 INFO-CODE > yamlget.out.test$n 2>&1 || ret=1
read -r value < yamlget.out.test$n
[ "$value" = "24 (Invalid Data)" ] || 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
if [ $ret -ne 0 ]; then echo_i "failed"; fi
status=$((status+ret))
n=$((n+1))
echo_i "check that +yaml Extended DNS Error 25 is printed correctly ($n)"
# First undefined EDE code, additional text "foo".
dig_with_opts @10.53.0.3 +yaml +ednsopt=ede:0019666f6f 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 INFO-CODE > yamlget.out.test$n 2>&1 || ret=1
read -r value < yamlget.out.test$n
[ "$value" = "25" ] || 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))
n=$((n+1))
echo_i "check that invalid Extended DNS Error (length 0) is printed ($n)"
# EDE payload is too short
dig_with_opts @10.53.0.3 +yaml +ednsopt=ede 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 > yamlget.out.test$n 2>&1 || ret=1
read -r value < yamlget.out.test$n
[ "$value" = "None" ] || ret=1
if [ $ret -ne 0 ]; then echo_i "failed"; fi
status=$((status+ret))
n=$((n+1))
echo_i "check that invalid +yaml Extended DNS Error (length 1) is printed ($n)"
# EDE payload is too short
dig_with_opts @10.53.0.3 +yaml +ednsopt=ede:00 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 > yamlget.out.test$n 2>&1 || ret=1
read -r value < yamlget.out.test$n
[ "$value" = '00 (".")' ] || ret=1
if [ $ret -ne 0 ]; then echo_i "failed"; fi
status=$((status+ret))
fi
n=$((n+1))
echo_i "check that dig handles malformed option '+ednsopt=:' gracefully ($n)"
ret=0

View File

@@ -3560,6 +3560,7 @@ dns_message_pseudosectiontoyaml(dns_message_t *msg, dns_pseudosection_t section,
uint16_t optcode, optlen;
size_t saved_count;
unsigned char *optdata;
unsigned int indent;
REQUIRE(DNS_MESSAGE_VALID(msg));
REQUIRE(target != NULL);
@@ -3580,7 +3581,7 @@ dns_message_pseudosectiontoyaml(dns_message_t *msg, dns_pseudosection_t section,
INDENT(style);
ADD_STRING(target, "EDNS:\n");
msg->indent.count++;
indent = ++msg->indent.count;
INDENT(style);
ADD_STRING(target, "version: ");
@@ -3626,6 +3627,8 @@ dns_message_pseudosectiontoyaml(dns_message_t *msg, dns_pseudosection_t section,
isc_buffer_init(&optbuf, rdata.data, rdata.length);
isc_buffer_add(&optbuf, rdata.length);
while (isc_buffer_remaininglength(&optbuf) != 0) {
bool extra_text = false;
msg->indent.count = indent;
INSIST(isc_buffer_remaininglength(&optbuf) >= 4U);
optcode = isc_buffer_getuint16(&optbuf);
optlen = isc_buffer_getuint16(&optbuf);
@@ -3718,6 +3721,33 @@ dns_message_pseudosectiontoyaml(dns_message_t *msg, dns_pseudosection_t section,
ADD_STRING(target, "\n");
continue;
}
} else if (optcode == DNS_OPT_EDE) {
INDENT(style);
ADD_STRING(target, "EDE:");
if (optlen >= 2U) {
uint16_t ede;
ADD_STRING(target, "\n");
msg->indent.count++;
INDENT(style);
ADD_STRING(target, "INFO-CODE:");
ede = isc_buffer_getuint16(&optbuf);
snprintf(buf, sizeof(buf), " %u", ede);
ADD_STRING(target, buf);
if (ede < ARRAY_SIZE(edetext)) {
ADD_STRING(target, " (");
ADD_STRING(target,
edetext[ede]);
ADD_STRING(target, ")");
}
ADD_STRING(target, "\n");
optlen -= 2;
if (optlen != 0) {
INDENT(style);
ADD_STRING(target,
"EXTRA-TEXT:");
extra_text = true;
}
}
} else if (optcode == DNS_OPT_CLIENT_TAG) {
uint16_t id;
INDENT(style);
@@ -3751,23 +3781,31 @@ dns_message_pseudosectiontoyaml(dns_message_t *msg, dns_pseudosection_t section,
if (optlen != 0) {
int i;
bool utf8ok = false;
ADD_STRING(target, " ");
optdata = isc_buffer_current(&optbuf);
for (i = 0; i < optlen; i++) {
const char *sep;
switch (optcode) {
case DNS_OPT_COOKIE:
sep = "";
break;
default:
sep = " ";
break;
if (extra_text) {
utf8ok = isc_utf8_valid(optdata,
optlen);
}
if (!utf8ok) {
for (i = 0; i < optlen; i++) {
const char *sep;
switch (optcode) {
case DNS_OPT_COOKIE:
sep = "";
break;
default:
sep = " ";
break;
}
snprintf(buf, sizeof(buf),
"%02x%s", optdata[i],
sep);
ADD_STRING(target, buf);
}
snprintf(buf, sizeof(buf), "%02x%s",
optdata[i], sep);
ADD_STRING(target, buf);
}
isc_buffer_forward(&optbuf, optlen);
@@ -3806,24 +3844,34 @@ dns_message_pseudosectiontoyaml(dns_message_t *msg, dns_pseudosection_t section,
* For non-COOKIE options, add a printable
* version
*/
ADD_STRING(target, "(\"");
if (!extra_text) {
ADD_STRING(target, "(\"");
} 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])) {
if (isprint(optdata[i]) ||
(utf8ok && optdata[i] > 127)) {
isc_buffer_putmem(
target, &optdata[i], 1);
} else {
isc_buffer_putstr(target, ".");
}
}
ADD_STRING(target, "\")");
if (!extra_text) {
ADD_STRING(target, "\")");
} else {
ADD_STRING(target, "\"");
}
}
ADD_STRING(target, "\n");
}
msg->indent.count = indent;
result = ISC_R_SUCCESS;
goto cleanup;
case DNS_PSEUDOSECTION_TSIG:
@@ -4038,7 +4086,6 @@ dns_message_pseudosectiontotext(dns_message_t *msg, dns_pseudosection_t section,
ede = isc_buffer_getuint16(&optbuf);
snprintf(buf, sizeof(buf), " %u", ede);
ADD_STRING(target, buf);
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
if (ede < ARRAY_SIZE(edetext)) {
ADD_STRING(target, " (");
ADD_STRING(target,
@@ -4164,10 +4211,8 @@ dns_message_pseudosectiontotext(dns_message_t *msg, dns_pseudosection_t section,
return (ISC_R_NOSPACE);
}
for (i = 0; i < optlen; i++) {
if (isprint(optdata[i])) {
isc_buffer_putmem(
target, &optdata[i], 1);
} else if (utf8ok && optdata[i] > 127) {
if (isprint(optdata[i]) ||
(utf8ok && optdata[i] > 127)) {
isc_buffer_putmem(
target, &optdata[i], 1);
} else {

View File

@@ -76,6 +76,8 @@
var = _u.v; \
} while (0)
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
/*%
* Use this in translation units that would otherwise be empty, to
* suppress compiler warnings.