diff --git a/src/seeder/test/dns_tests.cpp b/src/seeder/test/dns_tests.cpp --- a/src/seeder/test/dns_tests.cpp +++ b/src/seeder/test/dns_tests.cpp @@ -15,6 +15,7 @@ // Max size of the null-terminated buffer parse_name() writes to. static const int MAX_QUERY_NAME_BUFFER_LENGTH = MAX_QUERY_NAME_LENGTH + 1; static const uint8_t END_OF_NAME_FIELD = 0; +static const size_t MAX_LABEL_LENGTH = 63; // Builds the name field of the question section of a DNS query static std::vector @@ -85,6 +86,20 @@ } } +static void CheckParseNameError( + const std::string &queryName, const int expectedError, + const size_t &outputBufferSize = MAX_QUERY_NAME_BUFFER_LENGTH) { + std::vector nameField = CreateDNSQuestionNameField(queryName); + + std::vector parsedQueryName(outputBufferSize, 0); + const uint8_t *nameFieldBegin = nameField.data(); + int ret = parse_name(&nameFieldBegin, nameFieldBegin + nameField.size(), + nameField.data(), parsedQueryName.data(), + parsedQueryName.size()); + + BOOST_CHECK_EQUAL(ret, expectedError); +} + BOOST_AUTO_TEST_CASE(parse_name_tests) { CheckParseName("www.domain.com"); CheckParseName("domain.com"); @@ -95,4 +110,13 @@ CheckParseName("my-domain.com"); } +BOOST_AUTO_TEST_CASE(parse_name_label_tests) { + // Check behavior for name with maximum length label + const std::string maxLengthLabel(MAX_LABEL_LENGTH, 'a'); + CheckParseName("www." + maxLengthLabel + ".com"); + + // Check that an oversized label causes an error + CheckParseNameError("www." + maxLengthLabel + "a.com", -1); +} + BOOST_AUTO_TEST_SUITE_END()