/** * @pre closure points to a valid isc_buffer * @pre isc_buffer has non-NULL mctx * @pre isc_buffer has NULL buffer OR a buffer allocated from mctx * * @post closure contains \0 terminated string which is concatenation * of previous context and input text */ static void buffer_append_str(void *closure, const char *text, int textlen) { isc_buffer_t *out_buf = closure; isc_region_t new_space; isc_region_t old_space; REQUIRE(ISC_BUFFER_VALID(out_buf)); REQUIRE(out_buf->mctx != NULL); REQUIRE(text != NULL); /* Allocate sufficiently long output buffer. */ isc_buffer_region(out_buf, &old_space); new_space.length = isc_buffer_length(out_buf) + textlen + 1; new_space.base = isc_mem_get(out_buf->mctx, new_space.length); RUNTIME_CHECK(new_space.base != NULL); isc_buffer_reinit(out_buf, new_space.base, new_space.length); if (old_space.base != NULL) isc_mem_put(out_buf->mctx, old_space.base, old_space.length); /* Append output text and \0-terminate it. * Overwrite \0 at the end if needed. */ if (isc_buffer_usedlength(out_buf) != 0) /* Previous string is \0 terminated, chop \0. */ isc_buffer_subtract(out_buf, 1); isc_buffer_putstr(out_buf, text); isc_buffer_putuint8(out_buf, '\0'); }
/* * Compares only the public portion of two keys, by converting them * both to wire format and comparing the results. */ static isc_boolean_t pub_compare(const dst_key_t *key1, const dst_key_t *key2) { isc_result_t result; unsigned char buf1[DST_KEY_MAXSIZE], buf2[DST_KEY_MAXSIZE]; isc_buffer_t b1, b2; isc_region_t r1, r2; isc_buffer_init(&b1, buf1, sizeof(buf1)); result = dst_key_todns(key1, &b1); if (result != ISC_R_SUCCESS) return (ISC_FALSE); /* Zero out flags. */ buf1[0] = buf1[1] = 0; if ((key1->key_flags & DNS_KEYFLAG_EXTENDED) != 0) isc_buffer_subtract(&b1, 2); isc_buffer_init(&b2, buf2, sizeof(buf2)); result = dst_key_todns(key2, &b2); if (result != ISC_R_SUCCESS) return (ISC_FALSE); /* Zero out flags. */ buf2[0] = buf2[1] = 0; if ((key2->key_flags & DNS_KEYFLAG_EXTENDED) != 0) isc_buffer_subtract(&b2, 2); isc_buffer_usedregion(&b1, &r1); /* Remove extended flags. */ if ((key1->key_flags & DNS_KEYFLAG_EXTENDED) != 0) { memmove(&buf1[4], &buf1[6], r1.length - 6); r1.length -= 2; } isc_buffer_usedregion(&b2, &r2); /* Remove extended flags. */ if ((key2->key_flags & DNS_KEYFLAG_EXTENDED) != 0) { memmove(&buf2[4], &buf2[6], r2.length - 6); r2.length -= 2; } return (ISC_TF(isc_region_compare(&r1, &r2) == 0)); }