/* verify round-trip conversion of first name */
size_t keylen = dns_qpkey_fromname(key, namein);
- qp_test_keytoname(key, nameout);
+ qp_test_keytoname(key, keylen, nameout);
assert(dns_name_equal(namein, nameout));
assert_memory_equal(testcases[i].key, key, len);
out = dns_fixedname_initname(&fn2);
- qp_test_keytoname(key, out);
+ qp_test_keytoname(key, len, out);
assert_true(dns_name_equal(in, out));
}
}
* functions, this is a complete inverse of dns_qpkey_fromname().
*/
void
-qp_test_keytoname(const dns_qpkey_t key, dns_name_t *name);
+qp_test_keytoname(const dns_qpkey_t key, size_t len, dns_name_t *name);
/*
* The maximum height of the trie
env_workers = getenv("ISC_TASK_WORKERS");
if (env_workers != NULL) {
workers = atoi(env_workers);
- } else {
+ }
+ if (workers < 2 || workers > 1000) {
/* We always need at least two loops for some of the tests */
workers = isc_os_ncpus() + 1;
}
- INSIST(workers != 0);
isc_loopmgr_create(mctx, workers, &loopmgr);
mainloop = isc_loop_main(loopmgr);
}
void
-qp_test_keytoname(const dns_qpkey_t key, dns_name_t *name) {
- size_t locs[128];
+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;
isc_buffer_clear(name->buffer);
/* Scan the key looking for label boundaries */
- for (offset = 0; offset < 512; offset++) {
+ for (offset = 0; offset <= keylen; offset++) {
INSIST(key[offset] >= SHIFT_NOBYTE &&
key[offset] < SHIFT_OFFSET);
- INSIST(loc < 128);
- if (key[offset] == SHIFT_NOBYTE) {
- if (key[offset + 1] == SHIFT_NOBYTE) {
+ 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;
- break;
+ goto scanned;
}
locs[loc++] = offset + 1;
} else if (offset == 0) {
locs[loc++] = offset;
}
}
+ UNREACHABLE();
+scanned:
/*
* In the key the labels are encoded in reverse order, so
/* Convert from escaped byte ranges to ASCII */
for (offset = locs[loc]; offset < locs[loc + 1] - 1; offset++) {
- uint8_t byte = dns_qp_byte_for_bit[key[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 {