modify dns_qp_findname_ancestor() to return found name
add a 'foundname' parameter to dns_qp_findname_ancestor(), and use it to set the found name in dns_nametree. this required adding a dns_qpkey_toname() function; that was done by moving qp_test_keytoname() from the test library to qp.c. added some more test cases and fixed bugs with the handling of relative and empty names.
This commit is contained in:
@@ -61,80 +61,6 @@ qp_test_keytoascii(dns_qpkey_t key, size_t len) {
|
||||
return ((const char *)key);
|
||||
}
|
||||
|
||||
void
|
||||
qp_test_keytoname(const dns_qpkey_t key, size_t keylen, dns_name_t *name) {
|
||||
size_t locs[DNS_NAME_MAXLABELS];
|
||||
size_t loc = 0, opos = 0;
|
||||
size_t offset;
|
||||
|
||||
REQUIRE(ISC_MAGIC_VALID(name, DNS_NAME_MAGIC));
|
||||
REQUIRE(name->buffer != NULL);
|
||||
REQUIRE(name->offsets != NULL);
|
||||
|
||||
isc_buffer_clear(name->buffer);
|
||||
|
||||
/* Scan the key looking for label boundaries */
|
||||
for (offset = 0; offset <= keylen; offset++) {
|
||||
INSIST(key[offset] >= SHIFT_NOBYTE &&
|
||||
key[offset] < SHIFT_OFFSET);
|
||||
INSIST(loc < DNS_NAME_MAXLABELS);
|
||||
if (qpkey_bit(key, keylen, offset) == SHIFT_NOBYTE) {
|
||||
if (qpkey_bit(key, keylen, offset + 1) == SHIFT_NOBYTE)
|
||||
{
|
||||
locs[loc] = offset + 1;
|
||||
goto scanned;
|
||||
}
|
||||
locs[loc++] = offset + 1;
|
||||
} else if (offset == 0) {
|
||||
/* This happens for a relative name */
|
||||
locs[loc++] = offset;
|
||||
}
|
||||
}
|
||||
UNREACHABLE();
|
||||
scanned:
|
||||
|
||||
/*
|
||||
* In the key the labels are encoded in reverse order, so
|
||||
* we step backward through the label boundaries, then forward
|
||||
* through the labels, to create the DNS wire format data.
|
||||
*/
|
||||
name->labels = loc;
|
||||
while (loc-- > 0) {
|
||||
uint8_t len = 0, *lenp = NULL;
|
||||
|
||||
/* Add a length byte to the name data and set an offset */
|
||||
lenp = isc_buffer_used(name->buffer);
|
||||
isc_buffer_putuint8(name->buffer, 0);
|
||||
name->offsets[opos++] = name->length++;
|
||||
|
||||
/* Convert from escaped byte ranges to ASCII */
|
||||
for (offset = locs[loc]; offset < locs[loc + 1] - 1; offset++) {
|
||||
uint8_t bit = qpkey_bit(key, keylen, offset);
|
||||
uint8_t byte = dns_qp_byte_for_bit[bit];
|
||||
if (qp_common_character(byte)) {
|
||||
isc_buffer_putuint8(name->buffer, byte);
|
||||
} else {
|
||||
byte += key[++offset] - SHIFT_BITMAP;
|
||||
isc_buffer_putuint8(name->buffer, byte);
|
||||
}
|
||||
len++;
|
||||
}
|
||||
|
||||
name->length += len;
|
||||
*lenp = len;
|
||||
}
|
||||
|
||||
/* Add a root label for absolute names */
|
||||
if (key[0] == SHIFT_NOBYTE) {
|
||||
name->attributes.absolute = true;
|
||||
isc_buffer_putuint8(name->buffer, 0);
|
||||
name->length++;
|
||||
name->labels++;
|
||||
}
|
||||
|
||||
name->ndata = isc_buffer_base(name->buffer);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* trie properties
|
||||
|
||||
Reference in New Issue
Block a user