Skip to content
Snippets Groups Projects
Commit 35eeedd0 authored by Marek Vavruša's avatar Marek Vavruša
Browse files

Merge branch 'obsolete_records' of /git/repositories/knot

parents 55508aff c0e1efdb
No related branches found
No related tags found
No related merge requests found
......@@ -76,12 +76,12 @@ static const rdata_descriptor_t rdata_descriptors[] = {
KNOT_RDATA_WF_END }, "KEY" },
[KNOT_RRTYPE_AAAA] = { { 16, KNOT_RDATA_WF_END }, "AAAA" },
[KNOT_RRTYPE_LOC] = { { 16, KNOT_RDATA_WF_END }, "LOC" },
[KNOT_RRTYPE_SRV] = { { 6, KNOT_RDATA_WF_UNCOMPRESSED_DNAME,
[KNOT_RRTYPE_SRV] = { { 6, KNOT_RDATA_WF_COMPRESSED_DNAME,
KNOT_RDATA_WF_END }, "SRV" },
[KNOT_RRTYPE_NAPTR] = { { KNOT_RDATA_WF_NAPTR_HEADER,
KNOT_RDATA_WF_UNCOMPRESSED_DNAME,
KNOT_RDATA_WF_COMPRESSED_DNAME,
KNOT_RDATA_WF_END }, "NAPTR" },
[KNOT_RRTYPE_KX] = { { 2, KNOT_RDATA_WF_COMPRESSED_DNAME,
[KNOT_RRTYPE_KX] = { { 2, KNOT_RDATA_WF_UNCOMPRESSED_DNAME,
KNOT_RDATA_WF_END }, "KX" },
[KNOT_RRTYPE_CERT] = { { KNOT_RDATA_WF_REMAINDER,
KNOT_RDATA_WF_END }, "CERT" },
......@@ -97,10 +97,10 @@ static const rdata_descriptor_t rdata_descriptors[] = {
KNOT_RDATA_WF_END }, "SSHFP" },
[KNOT_RRTYPE_IPSECKEY] = { { KNOT_RDATA_WF_REMAINDER,
KNOT_RDATA_WF_END }, "IPSECKEY" },
[KNOT_RRTYPE_RRSIG] = { { 18, KNOT_RDATA_WF_LITERAL_DNAME,
[KNOT_RRTYPE_RRSIG] = { { 18, KNOT_RDATA_WF_UNCOMPRESSED_DNAME,
KNOT_RDATA_WF_REMAINDER,
KNOT_RDATA_WF_END }, "RRSIG" },
[KNOT_RRTYPE_NSEC] = { { KNOT_RDATA_WF_LITERAL_DNAME,
[KNOT_RRTYPE_NSEC] = { { KNOT_RDATA_WF_UNCOMPRESSED_DNAME,
KNOT_RDATA_WF_REMAINDER,
KNOT_RDATA_WF_END }, "NSEC" },
[KNOT_RRTYPE_DNSKEY] = { { KNOT_RDATA_WF_REMAINDER,
......@@ -118,7 +118,7 @@ static const rdata_descriptor_t rdata_descriptors[] = {
[KNOT_RRTYPE_NID] = { { 10 }, "NID" },
[KNOT_RRTYPE_L32] = { { 6 }, "L32" },
[KNOT_RRTYPE_L64] = { { 10 }, "L64" },
[KNOT_RRTYPE_LP] = { { 2, KNOT_RDATA_WF_COMPRESSED_DNAME },
[KNOT_RRTYPE_LP] = { { 2, KNOT_RDATA_WF_UNCOMPRESSED_DNAME },
"LP" },
[KNOT_RRTYPE_EUI48] = { { 6, KNOT_RDATA_WF_END }, "EUI48" },
[KNOT_RRTYPE_EUI64] = { { 8, KNOT_RDATA_WF_END }, "EUI64" },
......@@ -136,6 +136,30 @@ static const rdata_descriptor_t rdata_descriptors[] = {
KNOT_RDATA_WF_END }, "ANY" },
};
/*!
* \brief Some (OBSOLETE) RR type descriptors.
*/
static const rdata_descriptor_t obsolete_rdata_descriptors[] = {
[0] = { { KNOT_RDATA_WF_REMAINDER,
KNOT_RDATA_WF_END }, NULL },
[KNOT_RRTYPE_MD] = { { KNOT_RDATA_WF_COMPRESSED_DNAME,
KNOT_RDATA_WF_END }, "MD" },
[KNOT_RRTYPE_MF] = { { KNOT_RDATA_WF_COMPRESSED_DNAME,
KNOT_RDATA_WF_END }, "MF" },
[KNOT_RRTYPE_MB] = { { KNOT_RDATA_WF_COMPRESSED_DNAME,
KNOT_RDATA_WF_END }, "MB" },
[KNOT_RRTYPE_MG] = { { KNOT_RDATA_WF_COMPRESSED_DNAME,
KNOT_RDATA_WF_END }, "MG" },
[KNOT_RRTYPE_MR] = { { KNOT_RDATA_WF_COMPRESSED_DNAME,
KNOT_RDATA_WF_END }, "MR" },
[KNOT_RRTYPE_PX] = { { 2, KNOT_RDATA_WF_COMPRESSED_DNAME,
KNOT_RDATA_WF_COMPRESSED_DNAME,
KNOT_RDATA_WF_END }, "PX" },
[KNOT_RRTYPE_NXT] = { { KNOT_RDATA_WF_COMPRESSED_DNAME,
KNOT_RDATA_WF_REMAINDER,
KNOT_RDATA_WF_END }, "NXT" },
};
const rdata_descriptor_t *get_rdata_descriptor(const uint16_t type)
{
if (type <= KNOT_RRTYPE_ANY && rdata_descriptors[type].type_name != 0) {
......@@ -145,6 +169,16 @@ const rdata_descriptor_t *get_rdata_descriptor(const uint16_t type)
}
}
const rdata_descriptor_t *get_obsolete_rdata_descriptor(const uint16_t type)
{
if (type <= KNOT_RRTYPE_NXT &&
obsolete_rdata_descriptors[type].type_name != 0) {
return &obsolete_rdata_descriptors[type];
} else {
return &obsolete_rdata_descriptors[0];
}
}
int knot_rrtype_to_string(const uint16_t rrtype,
char *out,
const size_t out_len)
......@@ -251,8 +285,7 @@ int knot_rrclass_from_string(const char *name, uint16_t *num)
int descriptor_item_is_dname(const int item)
{
return item == KNOT_RDATA_WF_LITERAL_DNAME ||
item == KNOT_RDATA_WF_COMPRESSED_DNAME ||
return item == KNOT_RDATA_WF_COMPRESSED_DNAME ||
item == KNOT_RDATA_WF_UNCOMPRESSED_DNAME;
}
......
......@@ -109,6 +109,25 @@ enum knot_rr_type {
KNOT_RRTYPE_ANY = 255 /*!< QTYPE. Any record. */
};
/*!
* \brief Some (OBSOLETE) resource record type constants.
*
* http://www.iana.org/assignments/dns-parameters/dns-parameters.xml
*
* \note These records can contain compressed domain name in rdata so
* it is important to know the position of it during transfers.
* See RFC 3597#4.
*/
enum knot_obsolete_rr_type {
KNOT_RRTYPE_MD = 3,
KNOT_RRTYPE_MF = 4,
KNOT_RRTYPE_MB = 7,
KNOT_RRTYPE_MG = 8,
KNOT_RRTYPE_MR = 9,
KNOT_RRTYPE_PX = 26,
KNOT_RRTYPE_NXT = 30
};
/*!
* \brief Constants characterising the wire format of RDATA items.
*/
......@@ -117,8 +136,6 @@ enum knot_rdata_wireformat {
KNOT_RDATA_WF_COMPRESSED_DNAME = -10,
/*!< Uncompressed dname. */
KNOT_RDATA_WF_UNCOMPRESSED_DNAME,
/*!< Dname with preserved letter cases. */
KNOT_RDATA_WF_LITERAL_DNAME,
/*!< Initial part of NAPTR record before dname. */
KNOT_RDATA_WF_NAPTR_HEADER,
/*!< Uninteresting final part of a record. */
......@@ -140,13 +157,23 @@ typedef struct {
/*!
* \brief Gets rdata descriptor for given RR name.
*
* \param name Mnemonic of RR type whose descriptor should be retvaled.
* \param name Mnemonic of RR type whose descriptor should be returned.
*
* \retval RR descriptor for given name, NULL descriptor if
* unknown type.
*/
const rdata_descriptor_t *get_rdata_descriptor(const uint16_t type);
/*!
* \brief Gets rdata descriptor for given RR name (obsolete version).
*
* \param name Mnemonic of RR type whose descriptor should be returned.
*
* \retval RR descriptor for given name, NULL descriptor if
* unknown type.
*/
const rdata_descriptor_t *get_obsolete_rdata_descriptor(const uint16_t type);
/*!
* \brief Converts numeric type representation to mnemonic string.
*
......
......@@ -1144,6 +1144,8 @@ int knot_rrset_rdata_from_wire_one(knot_rrset_t *rrset,
const uint8_t *wire, size_t *pos,
size_t total_size, size_t rdlength)
{
int obsolete = 0;
/* [code-review] Missing parameter checks. */
if (rdlength == 0) {
......@@ -1158,15 +1160,24 @@ int knot_rrset_rdata_from_wire_one(knot_rrset_t *rrset,
size_t extra_dname_size = 0;
const rdata_descriptor_t *desc = get_rdata_descriptor(rrset->type);
/* Check for obsolete record. */
if (desc->type_name == NULL) {
desc = get_obsolete_rdata_descriptor(rrset->type);
if (desc->type_name != NULL) {
obsolete = 1;
}
}
for (int i = 0; desc->block_types[i] != KNOT_RDATA_WF_END; ++i) {
if (descriptor_item_is_dname(desc->block_types[i])) {
extra_dname_size += sizeof(knot_dname_t *) - 1;
if (obsolete) {
extra_dname_size += KNOT_MAX_DNAME_LENGTH;
} else {
extra_dname_size += sizeof(knot_dname_t *);
}
}
}
/* [code-review] Isn't this invalid? You cannot do static allocation
* with dynamic data (parameter, local variable).
*/
uint8_t rdata_buffer[rdlength + extra_dname_size];
memset(rdata_buffer, 0, rdlength + extra_dname_size);
dbg_rrset_detail("rr: parse_rdata_wire: Added %zu bytes to buffer to "
......@@ -1188,9 +1199,7 @@ int knot_rrset_rdata_from_wire_one(knot_rrset_t *rrset,
return KNOT_EMALF;
}
knot_dname_to_lower(dname);
memcpy(rdata_buffer + offset, &dname,
sizeof(knot_dname_t *));
parsed += pos2 - *pos;
dbg_rrset_detail("rr: parse_rdata_wire: Parsed DNAME, "
"length=%zu.\n", pos2 - *pos);
dbg_rrset_exec_detail(
......@@ -1199,8 +1208,19 @@ dbg_rrset_exec_detail(
"DNAME=%s\n", name);
free(name);
);
if (obsolete) {
memcpy(rdata_buffer + offset,
knot_dname_name(dname),
knot_dname_size(dname));
offset += knot_dname_size(dname);
knot_dname_free(&dname);
} else {
memcpy(rdata_buffer + offset, &dname,
sizeof(knot_dname_t *));
offset += sizeof(knot_dname_t *);
}
parsed += pos2 - *pos;
*pos = pos2;
offset += sizeof(knot_dname_t *);
} else if (descriptor_item_is_fixed(item)) {
dbg_rrset_detail("rr: parse_rdata_wire: Saving static "
"chunk of size=%u\n", item);
......
......@@ -36,7 +36,7 @@ unit_api descriptor_tests_api = {
static int descriptor_tests_count(int argc, char *argv[])
{
return 68;
return 81;
}
static int descriptor_tests_run(int argc, char *argv[])
......@@ -230,5 +230,40 @@ static int descriptor_tests_run(int argc, char *argv[])
ret = knot_rrclass_from_string("CLASS65536", &num);
cmp_ok(ret, "==", -1, "get CLASS65536 num ret");
// Get obsolete descriptor:
// 30. TYPE0
descr = get_obsolete_rdata_descriptor(0);
ok(descr->type_name == 0, "get TYPE0 descriptor name");
cmp_ok(descr->block_types[0], "==", KNOT_RDATA_WF_REMAINDER,
"get TYPE0 descriptor 1. item type");
cmp_ok(descr->block_types[1], "==", KNOT_RDATA_WF_END,
"get TYPE0 descriptor 2. item type");
// 31. MD
descr = get_obsolete_rdata_descriptor(3);
ok(strcmp(descr->type_name, "MD") == 0, "get MD descriptor name");
cmp_ok(descr->block_types[0], "==", KNOT_RDATA_WF_COMPRESSED_DNAME,
"get A descriptor 1. item type");
cmp_ok(descr->block_types[1], "==", KNOT_RDATA_WF_END,
"get A descriptor 2. item type");
// 32. NXT
descr = get_obsolete_rdata_descriptor(30);
ok(strcmp(descr->type_name, "NXT") == 0, "get NXT descriptor name");
cmp_ok(descr->block_types[0], "==", KNOT_RDATA_WF_COMPRESSED_DNAME,
"get CNAME descriptor 1. item type");
cmp_ok(descr->block_types[1], "==", KNOT_RDATA_WF_REMAINDER,
"get CNAME descriptor 2. item type");
cmp_ok(descr->block_types[2], "==", KNOT_RDATA_WF_END,
"get CNAME descriptor 3. item type");
// 33. TYPE38 (A6)
descr = get_obsolete_rdata_descriptor(38);
ok(descr->type_name == 0, "get TYPE38 descriptor name");
cmp_ok(descr->block_types[0], "==", KNOT_RDATA_WF_REMAINDER,
"get TYPE38 descriptor 1. item type");
cmp_ok(descr->block_types[1], "==", KNOT_RDATA_WF_END,
"get TYPE38 descriptor 2. item type");
return 0;
}
......@@ -920,7 +920,6 @@ static int32_t get_block_length(const uint8_t *data,
switch (type) {
case KNOT_RDATA_WF_COMPRESSED_DNAME:
case KNOT_RDATA_WF_UNCOMPRESSED_DNAME:
case KNOT_RDATA_WF_LITERAL_DNAME:
ret = get_dname_length(data + offset, data_len - offset);
if (ret > 0) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment