diff --git a/src/seeder/dns.cpp b/src/seeder/dns.cpp --- a/src/seeder/dns.cpp +++ b/src/seeder/dns.cpp @@ -78,6 +78,12 @@ } // add dot in output if (!init) { + // The maximum size of a query name is 255. + // The buffer must have room for the '.' and a valid non-'.' + // character + if (bufused > 253) { + return -1; + } if (bufused == bufsize - 1) { return -2; } @@ -103,7 +109,7 @@ } // copy label while (octet) { - if (*inpos == inend) { + if (*inpos == inend || bufused > 254) { return -1; } if (bufused == bufsize - 1) { diff --git a/src/seeder/test/seeder_tests.cpp b/src/seeder/test/seeder_tests.cpp --- a/src/seeder/test/seeder_tests.cpp +++ b/src/seeder/test/seeder_tests.cpp @@ -119,6 +119,9 @@ // Check that an oversized label causes an error CheckParseNameError("www." + maxLengthLabel + "a.com", -1); + + // Check that a query name that is too long causes an error + CheckParseNameError(maxLengthQName + "a", -1, 2 * maxLengthQName.size()); } BOOST_AUTO_TEST_SUITE_END()