mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-28 04:58:04 +00:00
Check multi-line output from dns_rdata_tofmttext()
Check that multi-line output from dns_rdata_tofmttext() can be read back in by dns_rdata_fromtext().
This commit is contained in:
parent
1a75a5cee6
commit
b089f43b7a
@ -299,6 +299,53 @@ check_text_conversions(dns_rdata_t *rdata) {
|
||||
assert_memory_equal(buf_fromtext, rdata->data, rdata->length);
|
||||
}
|
||||
|
||||
/*
|
||||
* Test whether converting rdata to multi-line text form and then parsing the
|
||||
* result of that conversion again results in the same uncompressed wire form.
|
||||
* This checks whether multi-line totext_*() output is parsable by fromtext_*()
|
||||
* for given RR class and type.
|
||||
*
|
||||
* This function is called for every input RDATA which is successfully parsed
|
||||
* by check_wire_ok_single() and whose type is not a meta-type.
|
||||
*/
|
||||
static void
|
||||
check_multiline_text_conversions(dns_rdata_t *rdata) {
|
||||
char buf_totext[1024] = { 0 };
|
||||
unsigned char buf_fromtext[1024];
|
||||
isc_result_t result;
|
||||
isc_buffer_t target;
|
||||
dns_rdata_t rdata2 = DNS_RDATA_INIT;
|
||||
unsigned int flags;
|
||||
|
||||
/*
|
||||
* Convert uncompressed wire form RDATA into multi-line text form.
|
||||
* This conversion must succeed since input RDATA was successfully
|
||||
* parsed by check_wire_ok_single().
|
||||
*/
|
||||
isc_buffer_init(&target, buf_totext, sizeof(buf_totext));
|
||||
flags = dns_master_styleflags(&dns_master_style_default);
|
||||
result = dns_rdata_tofmttext(rdata, dns_rootname, flags, 80 - 32, 4,
|
||||
"\n", &target);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
/*
|
||||
* Ensure buf_totext is properly NUL terminated as
|
||||
* dns_rdata_tofmttext() may attempt different output formats
|
||||
* writing into the apparently unused part of the buffer.
|
||||
*/
|
||||
isc_buffer_putuint8(&target, 0);
|
||||
|
||||
/*
|
||||
* Try parsing multi-line text form RDATA output by
|
||||
* dns_rdata_tofmttext() again.
|
||||
*/
|
||||
result = dns_test_rdatafromstring(&rdata2, rdata->rdclass, rdata->type,
|
||||
buf_fromtext, sizeof(buf_fromtext),
|
||||
buf_totext, false);
|
||||
assert_int_equal(result, ISC_R_SUCCESS);
|
||||
assert_int_equal(rdata2.length, rdata->length);
|
||||
assert_memory_equal(buf_fromtext, rdata->data, rdata->length);
|
||||
}
|
||||
|
||||
/*
|
||||
* Test whether supplied wire form RDATA is properly handled as being either
|
||||
* valid or invalid for an RR of given rdclass and type.
|
||||
@ -329,12 +376,16 @@ check_wire_ok_single(const wire_ok_t *wire_ok, dns_rdataclass_t rdclass,
|
||||
* between uncompressed wire form and type-specific struct.
|
||||
*
|
||||
* If the RR type is not a meta-type, additionally perform two-way
|
||||
* conversion checks between uncompressed wire form and text form.
|
||||
* conversion checks between:
|
||||
*
|
||||
* - uncompressed wire form and text form,
|
||||
* - uncompressed wire form and multi-line text form.
|
||||
*/
|
||||
if (result == ISC_R_SUCCESS) {
|
||||
check_struct_conversions(&rdata, structsize);
|
||||
if (!dns_rdatatype_ismeta(rdata.type)) {
|
||||
check_text_conversions(&rdata);
|
||||
check_multiline_text_conversions(&rdata);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user