diff --git a/lib/dns/ede.c b/lib/dns/ede.c index d5c7e2da48..7dcb05f281 100644 --- a/lib/dns/ede.c +++ b/lib/dns/ede.c @@ -24,6 +24,7 @@ void dns_ede_add(dns_edectx_t *edectx, uint16_t code, const char *text) { REQUIRE(DNS_EDE_VALID(edectx)); + REQUIRE(code <= DNS_EDE_MAX_CODE); size_t pos = 0; uint16_t becode = htobe16(code); diff --git a/lib/dns/include/dns/message.h b/lib/dns/include/dns/message.h index 6de8b3d3f4..e97c1a0674 100644 --- a/lib/dns/include/dns/message.h +++ b/lib/dns/include/dns/message.h @@ -150,6 +150,7 @@ #define DNS_EDE_NOREACHABLEAUTH 22 /*%< No Reachable Authority */ #define DNS_EDE_NETWORKERROR 23 /*%< Network Error */ #define DNS_EDE_INVALIDDATA 24 /*%< Invalid Data */ +#define DNS_EDE_MAX_CODE DNS_EDE_INVALIDDATA #define DNS_MESSAGE_REPLYPRESERVE (DNS_MESSAGEFLAG_RD | DNS_MESSAGEFLAG_CD) #define DNS_MESSAGEEXTFLAG_REPLYPRESERVE (DNS_MESSAGEEXTFLAG_DO) diff --git a/tests/dns/ede_test.c b/tests/dns/ede_test.c index db1340f519..b509fc1c45 100644 --- a/tests/dns/ede_test.c +++ b/tests/dns/ede_test.c @@ -32,60 +32,162 @@ #include -const struct { - uint16_t info_code; - char *extra_text; -} vectors[DNS_EDE_MAX_ERRORS] = { - { - 22, - NULL, - }, - { - 12, - (char *)"abcd", - }, - { - 4, - (char *)"abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabc" - "dabcdabcdadcdabcd", - }, -}; +typedef struct { + uint16_t code; + const char *txt; +} ede_test_expected_t; -ISC_RUN_TEST_IMPL(dns_edectx) { - dns_edectx_t edectx = { 0 }; - size_t pos = 0; - uint16_t becode; - uint8_t buf[sizeof(becode) + DNS_EDE_EXTRATEXT_LEN]; +static void +dns_ede_test_equals(const ede_test_expected_t *expected, size_t expected_count, + dns_edectx_t *edectx) { + size_t count = 0; + + for (size_t i = 0; i < DNS_EDE_MAX_ERRORS; i++) { + dns_ednsopt_t *edns = edectx->ede[i]; + + if (edns == NULL) { + break; + } + + uint16_t code; + const unsigned char *txt; + + assert_in_range(count, 0, expected_count); + assert_int_equal(edns->code, DNS_OPT_EDE); + + code = ISC_U8TO16_BE(edns->value); + assert_int_equal(code, expected[count].code); + + if (edns->length > sizeof(code)) { + assert_non_null(expected[count].txt); + txt = edns->value + sizeof(code); + assert_memory_equal(expected[count].txt, txt, + edns->length - sizeof(code)); + } else { + assert_null(expected[count].txt); + } + + count++; + } + assert_int_equal(count, expected_count); +} + +ISC_RUN_TEST_IMPL(dns_ede_test_text_max_count) { + dns_edectx_t edectx; dns_ede_init(mctx, &edectx); - for (size_t i = 0; i < DNS_EDE_MAX_ERRORS; i++) { - dns_ede_add(&edectx, vectors[i].info_code, - vectors[i].extra_text); - } + const char *txt1 = "foobar"; + const char *txt2 = "It's been a long time since I rock-and-rolled" + "Ooh, let me get it back, let me get it back"; - for (size_t i = 0; pos < DNS_EDE_MAX_ERRORS; pos++) { - dns_ednsopt_t *edns = edectx.ede[i]; - size_t textlen = 0; + dns_ede_add(&edectx, 2, txt1); + dns_ede_add(&edectx, 22, NULL); + dns_ede_add(&edectx, 3, txt2); - becode = htobe16(vectors[i].info_code); - memmove(buf, &becode, sizeof(becode)); - if (vectors[i].extra_text != NULL) { - textlen = strlen(vectors[i].extra_text); - memcpy(edns->value + sizeof(becode), - vectors[i].extra_text, textlen); - } + const ede_test_expected_t expected[3] = { + { .code = 2, .txt = "foobar" }, + { .code = 22, .txt = NULL }, + { .code = 3, + .txt = "It's been a long time since I rock-and-rolledOoh, " + "let me get it " } + }; - assert_memory_equal(buf, edectx.ede[i]->value, - sizeof(becode) + textlen); - } + dns_ede_test_equals(expected, 3, &edectx); dns_ede_reset(&edectx); } +ISC_RUN_TEST_IMPL(dns_ede_test_max_count) { + dns_edectx_t edectx; + + dns_ede_init(mctx, &edectx); + + dns_ede_add(&edectx, 1, NULL); + dns_ede_add(&edectx, 22, "two"); + dns_ede_add(&edectx, 3, "three"); + dns_ede_add(&edectx, 4, "four"); + dns_ede_add(&edectx, 5, "five"); + + const ede_test_expected_t expected[3] = { + { .code = 1, .txt = NULL }, + { .code = 22, .txt = "two" }, + { .code = 3, .txt = "three" }, + }; + + dns_ede_test_equals(expected, 3, &edectx); + + dns_ede_reset(&edectx); +} + +ISC_RUN_TEST_IMPL(dns_ede_test_duplicates) { + dns_edectx_t edectx; + + dns_ede_init(mctx, &edectx); + + dns_ede_add(&edectx, 1, NULL); + dns_ede_add(&edectx, 1, "two"); + dns_ede_add(&edectx, 1, "three"); + + const ede_test_expected_t expected[] = { + { .code = 1, .txt = NULL }, + }; + dns_ede_test_equals(expected, 1, &edectx); + + dns_ede_reset(&edectx); + + const ede_test_expected_t expectedempty[] = {}; + dns_ede_test_equals(expectedempty, 0, &edectx); +} + +ISC_RUN_TEST_IMPL(dns_ede_test_infocode_range) { + dns_edectx_t edectx; + + dns_ede_init(mctx, &edectx); + + dns_ede_add(&edectx, 1, NULL); + expect_assert_failure(dns_ede_add(&edectx, 32, NULL)); + + const ede_test_expected_t expected[] = { + { .code = 1, .txt = NULL }, + }; + dns_ede_test_equals(expected, 1, &edectx); + + dns_ede_reset(&edectx); +} + +ISC_RUN_TEST_IMPL(dns_ede_test_copy) { + dns_edectx_t edectx1; + dns_edectx_t edectx2; + + dns_ede_init(mctx, &edectx1); + dns_ede_init(mctx, &edectx2); + + dns_ede_add(&edectx1, 1, NULL); + dns_ede_add(&edectx1, 2, "two"); + dns_ede_add(&edectx1, 3, "three"); + + const ede_test_expected_t expected[] = { + { .code = 1, .txt = NULL }, + { .code = 2, .txt = "two" }, + { .code = 3, .txt = "three" }, + }; + + dns_ede_test_equals(expected, 3, &edectx1); + dns_ede_copy(&edectx2, &edectx1); + dns_ede_test_equals(expected, 3, &edectx2); + + dns_ede_reset(&edectx1); + dns_ede_reset(&edectx2); +} + ISC_TEST_LIST_START -ISC_TEST_ENTRY(dns_edectx) +ISC_TEST_ENTRY(dns_ede_test_text_max_count) +ISC_TEST_ENTRY(dns_ede_test_max_count) +ISC_TEST_ENTRY(dns_ede_test_duplicates) +ISC_TEST_ENTRY(dns_ede_test_infocode_range) +ISC_TEST_ENTRY(dns_ede_test_copy) ISC_TEST_LIST_END diff --git a/tests/ns/Makefile.am b/tests/ns/Makefile.am index 23b3ccbf7b..c26bec85e6 100644 --- a/tests/ns/Makefile.am +++ b/tests/ns/Makefile.am @@ -18,8 +18,7 @@ check_PROGRAMS = \ listenlist_test \ notify_test \ plugin_test \ - query_test \ - client_test + query_test notify_test_SOURCES = \ notify_test.c \ diff --git a/tests/ns/client_test.c b/tests/ns/client_test.c deleted file mode 100644 index b19f8b8ed3..0000000000 --- a/tests/ns/client_test.c +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright (C) Internet Systems Consortium, Inc. ("ISC") - * - * SPDX-License-Identifier: MPL-2.0 - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, you can obtain one at https://mozilla.org/MPL/2.0/. - * - * See the COPYRIGHT file distributed with this work for additional - * information regarding copyright ownership. - */ - -#include -#include /* IWYU pragma: keep */ -#include -#include -#include -#include -#include - -#define UNIT_TESTING -#include - -#include -#include -#include -#include -#include -#include - -#include - -#include - -typedef struct { - uint16_t code; - const char *txt; -} client_tests_ede_expected_t; - -static ns_clientmgr_t client_ede_test_dummy_manager; - -static ns_client_t * -client_ede_test_initclient(void) { - client_ede_test_dummy_manager.mctx = mctx; - - ns_client_t *client = isc_mem_get(mctx, sizeof(*client)); - memset(client, 0, sizeof(*client)); - client->magic = NS_CLIENT_MAGIC; - client->manager = &client_ede_test_dummy_manager; - - dns_ede_init(mctx, &client->edectx); - - return client; -} - -static void -client_ede_test_free(ns_client_t *client) { - dns_ede_reset(&client->edectx); - isc_mem_put(mctx, client, sizeof(*client)); -} - -static void -client_ede_test_equals(const client_tests_ede_expected_t *expected, - size_t expected_count, const ns_client_t *client) { - size_t count = 0; - - for (size_t i = 0; i < DNS_EDE_MAX_ERRORS; i++) { - dns_ednsopt_t *edns = client->edectx.ede[i]; - - if (edns == NULL) { - break; - } - - uint16_t code; - const unsigned char *txt; - - assert_in_range(count, 0, expected_count); - assert_int_equal(edns->code, DNS_OPT_EDE); - - code = ISC_U8TO16_BE(edns->value); - assert_int_equal(code, expected[count].code); - - if (edns->length > sizeof(code)) { - assert_non_null(expected[count].txt); - txt = edns->value + sizeof(code); - assert_memory_equal(expected[count].txt, txt, - edns->length - sizeof(code)); - } else { - assert_null(expected[count].txt); - } - - count++; - } - assert_int_equal(count, expected_count); -} - -ISC_RUN_TEST_IMPL(client_ede_test_text_max_count) { - ns_client_t *client = client_ede_test_initclient(); - - const char *txt1 = "foobar"; - const char *txt2 = "It's been a long time since I rock-and-rolled" - "Ooh, let me get it back, let me get it back"; - - dns_ede_add(&client->edectx, 2, txt1); - dns_ede_add(&client->edectx, 22, NULL); - dns_ede_add(&client->edectx, 3, txt2); - - const client_tests_ede_expected_t expected[3] = { - { .code = 2, .txt = "foobar" }, - { .code = 22, .txt = NULL }, - { .code = 3, - .txt = "It's been a long time since I rock-and-rolledOoh, " - "let me get it " } - }; - - client_ede_test_equals(expected, 3, client); - client_ede_test_free(client); -} - -ISC_RUN_TEST_IMPL(client_ede_test_max_count) { - ns_client_t *client = client_ede_test_initclient(); - - dns_ede_add(&client->edectx, 1, NULL); - dns_ede_add(&client->edectx, 22, "two"); - dns_ede_add(&client->edectx, 3, "three"); - dns_ede_add(&client->edectx, 4, "four"); - dns_ede_add(&client->edectx, 5, "five"); - - const client_tests_ede_expected_t expected[3] = { - { .code = 1, .txt = NULL }, - { .code = 22, .txt = "two" }, - { .code = 3, .txt = "three" }, - }; - - client_ede_test_equals(expected, 3, client); - client_ede_test_free(client); -} - -ISC_RUN_TEST_IMPL(client_ede_test_duplicates) { - ns_client_t *client = client_ede_test_initclient(); - - dns_ede_add(&client->edectx, 1, NULL); - dns_ede_add(&client->edectx, 1, "two"); - dns_ede_add(&client->edectx, 1, "three"); - - const client_tests_ede_expected_t expected[] = { - { .code = 1, .txt = NULL }, - }; - - client_ede_test_equals(expected, 1, client); - - client_ede_test_free(client); -} - -ISC_TEST_LIST_START - -ISC_TEST_ENTRY(client_ede_test_text_max_count) -ISC_TEST_ENTRY(client_ede_test_max_count) -ISC_TEST_ENTRY(client_ede_test_duplicates) - -ISC_TEST_LIST_END - -ISC_TEST_MAIN