image: "${{ needs.get-runner-container-image.outputs.id }}:${{ needs.get-runner-container-image.outputs.tag }}"
env:
UBSAN_OPTIONS: 'print_stacktrace=1:halt_on_error=1:suppressions=${{ env.REPO_HOME }}/build-scripts/UBSan.supp'
- ASAN_OPTIONS: detect_leaks=0
+ ASAN_OPTIONS: ""
+ LSAN_OPTIONS: "suppressions=${{ env.REPO_HOME }}/pdns/recursordist/recursor-lsan.supp"
TSAN_OPTIONS: "halt_on_error=1:suppressions=${{ env.REPO_HOME }}/pdns/recursordist/recursor-tsan.supp"
options: --sysctl net.ipv6.conf.all.disable_ipv6=0
steps:
thread_local FrameStreamServersInfo t_nodFrameStreamServersInfo;
#endif /* HAVE_FSTRM */
+/* g++ defines __SANITIZE_THREAD__
+ clang++ supports the nice __has_feature(thread_sanitizer),
+ let's merge them */
+#if defined(__has_feature)
+#if __has_feature(thread_sanitizer)
+#define __SANITIZE_THREAD__ 1
+#endif
+#if __has_feature(address_sanitizer)
+#define __SANITIZE_ADDRESS__ 1
+#endif
+#endif
+
string g_programname = "pdns_recursor";
string g_pidfname;
RecursorControlChannel g_rcc; // only active in the handler thread
signal(SIGTERM, termIntHandler);
signal(SIGINT, termIntHandler);
}
+#if defined(__SANITIZE_THREAD__) || (defined(__SANITIZE_ADDRESS__) && defined(HAVE_LEAK_SANITIZER_INTERFACE))
+ // If san is wanted, we dump the info ourselves
+ signal(SIGTERM, termIntHandler);
+#endif
signal(SIGUSR1, usr1Handler);
signal(SIGUSR2, usr2Handler);
#include "settings/cxxsettings.hh"
+/* g++ defines __SANITIZE_THREAD__
+ clang++ supports the nice __has_feature(thread_sanitizer),
+ let's merge them */
+#if defined(__has_feature)
+#if __has_feature(thread_sanitizer)
+#define __SANITIZE_THREAD__ 1
+#endif
+#if __has_feature(address_sanitizer)
+#define __SANITIZE_ADDRESS__ 1
+#if defined(__SANITIZE_ADDRESS__) && defined(HAVE_LEAK_SANITIZER_INTERFACE)
+#include <sanitizer/lsan_interface.h>
+#endif
+#endif
+#endif
+
std::pair<std::string, std::string> PrefixDashNumberCompare::prefixAndTrailingNum(const std::string& a)
{
auto i = a.length();
}
}
+static auto clearLuaScript()
+{
+ vector<string> empty;
+ empty.emplace_back();
+ return doQueueReloadLuaScript(empty.begin(), empty.end());
+}
+
void doExitGeneric(bool nicely)
{
+#if defined(__SANITIZE_THREAD__)
+ _exit(0); // regression test check for exit 0
+#endif
g_log << Logger::Error << "Exiting on user request" << endl;
g_rcc.~RecursorControlChannel();
RecursorControlChannel::stop = true;
}
else {
+#if defined(__SANITIZE_ADDRESS__) && defined(HAVE_LEAK_SANITIZER_INTERFACE)
+ clearLuaScript();
pdns::coverage::dumpCoverageData();
- _exit(1);
+ __lsan_do_leak_check();
+ _exit(0); // let the regression test distinguish between leaks and no leaks as __lsan_do_leak_check() exits 1 on leaks
+#else
+ pdns::coverage::dumpCoverageData();
+ _exit(1); // for historic reasons we exit 1
+#endif
}
}
return {0, doTraceRegex(begin == end ? FDWrapper(-1) : getfd(socket), begin, end)};
}
if (cmd == "unload-lua-script") {
- vector<string> empty;
- empty.emplace_back();
- return doQueueReloadLuaScript(empty.begin(), empty.end());
+ return clearLuaScript();
}
if (cmd == "reload-acls") {
return reloadACLs();