From c2f2d82c3f52bb62df33f0b7e57d55a88cdbe222 Mon Sep 17 00:00:00 2001 From: Otto Moerbeek Date: Mon, 18 Mar 2024 09:00:57 +0100 Subject: [PATCH] rec: fix trace=fail regression and add regression test for it --- pdns/recursordist/pdns_recursor.cc | 9 ++++ .../test_TraceFail.py | 48 +++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 regression-tests.recursor-dnssec/test_TraceFail.py diff --git a/pdns/recursordist/pdns_recursor.cc b/pdns/recursordist/pdns_recursor.cc index 56c9954643..c20d2876ee 100644 --- a/pdns/recursordist/pdns_recursor.cc +++ b/pdns/recursordist/pdns_recursor.cc @@ -857,6 +857,15 @@ static void dumpTrace(const string& trace, const timeval& timev) if (trace.empty()) { return; } + if (t_tracefd < 0) { + std::istringstream buf(trace); + g_log << Logger::Warning << "=== START OF FAIL TRACE ====" << endl; + for (string line; std::getline(buf, line);) { + g_log << Logger::Warning << line << endl; + } + g_log << Logger::Warning << "=== END OF FAIL TRACE ====" << endl; + return; + } timeval now{}; Utility::gettimeofday(&now); int traceFd = dup(t_tracefd); diff --git a/regression-tests.recursor-dnssec/test_TraceFail.py b/regression-tests.recursor-dnssec/test_TraceFail.py new file mode 100644 index 0000000000..52e8c29781 --- /dev/null +++ b/regression-tests.recursor-dnssec/test_TraceFail.py @@ -0,0 +1,48 @@ +import dns +import os +import time +import subprocess +from recursortests import RecursorTest + +class testTraceFail(RecursorTest): + _confdir = 'TraceFail' + + _config_template = """ +trace=fail +forward-zones-recurse=.=127.0.0.1:9999 +""" + + @classmethod + def setUpClass(cls): + + # we don't need all the auth stuff + cls.setUpSockets() + cls.startResponders() + + confdir = os.path.join('configs', cls._confdir) + cls.createConfigDir(confdir) + + cls.generateRecursorConfig(confdir) + cls.startRecursor(confdir, cls._recursorPort) + + @classmethod + def tearDownClass(cls): + cls.tearDownRecursor() + + def testA(self): + query = dns.message.make_query('example', 'A', want_dnssec=False) + res = self.sendUDPQuery(query) + self.assertRcodeEqual(res, dns.rcode.SERVFAIL) + + grepCmd = ['grep', 'END OF FAIL TRACE', 'configs/' + self._confdir + '/recursor.log'] + ret = b'' + for i in range(10): + time.sleep(1) + try: + ret = subprocess.check_output(grepCmd, stderr=subprocess.STDOUT) + except subprocess.CalledProcessError as e: + continue + print(b'A' + ret) + break + print(ret) + self.assertNotEqual(ret, b'') -- 2.47.2