From 1e68016192f09a30c1b8b3dd63ea564b756c6b81 Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Fri, 14 Jun 2024 10:48:57 +0200 Subject: [PATCH] dnsdist: Use `pdns::checked_stoi` instead of `sscanf` for `grepq`'s ms --- pdns/dnsdistdist/dnsdist-lua-inspection.cc | 42 +++++++++++++--------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/pdns/dnsdistdist/dnsdist-lua-inspection.cc b/pdns/dnsdistdist/dnsdist-lua-inspection.cc index 7e6742e1ec..245e68d8c5 100644 --- a/pdns/dnsdistdist/dnsdist-lua-inspection.cc +++ b/pdns/dnsdistdist/dnsdist-lua-inspection.cc @@ -259,10 +259,10 @@ static counts_t exceedRespByterate(unsigned int rate, int seconds) // NOLINTNEXTLINE(bugprone-exception-escape) struct GrepQParams { - boost::optional netmask; - boost::optional name; + std::optional netmask; + std::optional name; + std::optional msec; pdns::UniqueFilePtr outputFile{nullptr}; - int msec = -1; }; static std::optional parseGrepQParams(const LuaTypeOrArrayOf& inp, boost::optional>& options) @@ -302,21 +302,31 @@ static std::optional parseGrepQParams(const LuaTypeOrArrayOf(msecStr); + continue; } - else { - try { - result.name = DNSName(filter); - } - catch (...) { - g_outputBuffer = "Could not parse '" + filter + "' as domain name or netmask"; - return std::nullopt; - } + catch (...) { + /* that's OK, let's try to parse as a DNS name */ } } + + try { + result.name = DNSName(filter); + } + catch (...) { + g_outputBuffer = "Could not parse '" + filter + "' as domain name or netmask"; + return std::nullopt; + } } return result; } @@ -341,8 +351,8 @@ static bool ringEntryMatches(const GrepQParams& params, const C& entry) constexpr bool response = std::is_same_v; if constexpr (response) { - if (params.msec != -1) { - msecmatch = (entry.usec / 1000 > static_cast(params.msec)); + if (params.msec) { + msecmatch = (entry.usec / 1000 > *params.msec); } } @@ -584,7 +594,7 @@ void setupLuaInspection(LuaContext& luaCtx) fprintf(params.outputFile.get(), "%s", headLine.c_str()); } - if (params.msec == -1) { + if (!params.msec) { for (const auto& entry : queries) { if (!ringEntryMatches(params, entry)) { continue; -- 2.47.2