From 65ee2287e9b74f861872d9e16b9c11fb300cfabd Mon Sep 17 00:00:00 2001 From: Tim Wojtulewicz Date: Thu, 30 Jun 2022 16:33:58 -0700 Subject: [PATCH 1/2] Convert config framework to use std::regex --- src/input/readers/config/Config.cc | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/input/readers/config/Config.cc b/src/input/readers/config/Config.cc index e019008f81..948f372c38 100644 --- a/src/input/readers/config/Config.cc +++ b/src/input/readers/config/Config.cc @@ -2,11 +2,11 @@ #include "zeek/input/readers/config/Config.h" -#include #include #include #include #include +#include #include #include @@ -181,28 +181,32 @@ bool Config::DoUpdate() unseen_options.insert(i.first); } - regex_t re; - if ( regcomp(&re, "^([^[:blank:]]+)[[:blank:]]+([^[:blank:]](.*[^[:blank:]])?)?[[:blank:]]*$", - REG_EXTENDED) ) + std::regex re; + try { - Error(Fmt("Failed to compile regex.")); + re.assign("^([^[:blank:]]+)[[:blank:]]+([^[:blank:]](.*[^[:blank:]])?)?[[:blank:]]*$", + std::regex::extended); + } + catch ( const std::regex_error& e ) + { + Error(Fmt("Failed to compile regex: %s", e.what())); return true; } while ( GetLine(line) ) { - regmatch_t match[3]; - if ( regexec(&re, line.c_str(), 3, match, 0) ) + std::smatch match; + if ( ! std::regex_match(line, match, re) ) { Warning( Fmt("Could not parse '%s'; line has invalid format. Ignoring line.", line.c_str())); continue; } - std::string key = line.substr(match[1].rm_so, match[1].rm_eo - match[1].rm_so); + std::string key = match[1].str(); std::string value; - if ( match[2].rm_so > 0 ) - value = line.substr(match[2].rm_so, match[2].rm_eo - match[2].rm_so); + if ( match.size() > 2 ) + value = match[2].str(); auto typeit = option_types.find(key); if ( typeit == option_types.end() ) @@ -283,8 +287,6 @@ bool Config::DoUpdate() } } - regfree(&re); - if ( Info().mode != MODE_STREAM ) EndCurrentSend(); From 05bb50978905a6c3132b20eb2cfd246715f91356 Mon Sep 17 00:00:00 2001 From: Tim Wojtulewicz Date: Fri, 8 Jul 2022 15:33:41 -0700 Subject: [PATCH 2/2] GH-636: Fix regex to handle commas at the end of config parser lines --- src/input/readers/config/Config.cc | 6 ++++-- .../scripts.base.frameworks.config.basic/zeek.config.log | 3 ++- testing/btest/scripts/base/frameworks/config/basic.zeek | 1 + 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/input/readers/config/Config.cc b/src/input/readers/config/Config.cc index 948f372c38..bc50a52768 100644 --- a/src/input/readers/config/Config.cc +++ b/src/input/readers/config/Config.cc @@ -184,8 +184,10 @@ bool Config::DoUpdate() std::regex re; try { - re.assign("^([^[:blank:]]+)[[:blank:]]+([^[:blank:]](.*[^[:blank:]])?)?[[:blank:]]*$", - std::regex::extended); + std::string re_str = util::fmt( + "^([^[:blank:]]+)[[:blank:]]+([^[:blank:]](.*[^[:blank:]%c])?)?[[:blank:]%c]*$", + set_separator[0], set_separator[0]); + re.assign(re_str, std::regex::extended); } catch ( const std::regex_error& e ) { diff --git a/testing/btest/Baseline/scripts.base.frameworks.config.basic/zeek.config.log b/testing/btest/Baseline/scripts.base.frameworks.config.basic/zeek.config.log index 6d2ab58c17..ee147dbd53 100644 --- a/testing/btest/Baseline/scripts.base.frameworks.config.basic/zeek.config.log +++ b/testing/btest/Baseline/scripts.base.frameworks.config.basic/zeek.config.log @@ -23,7 +23,8 @@ XXXXXXXXXX.XXXXXX testsub 2607:f8b0:4001::/48 2607:f8b0:4002::/48 ../configfile XXXXXXXXXX.XXXXXX testinterval 1.0 sec 1.0 min ../configfile XXXXXXXXXX.XXXXXX testtime 0.0 XXXXXXXXXX.XXXXXX ../configfile XXXXXXXXXX.XXXXXX test_set (empty) a,d,b,c,erdbeerschnitzel ../configfile +XXXXXXXXXX.XXXXXX test_set a,d,b,c,erdbeerschnitzel a,c,b ../configfile XXXXXXXXXX.XXXXXX test_vector (empty) 1,2,3,4,5,6 ../configfile -XXXXXXXXXX.XXXXXX test_set a,d,b,c,erdbeerschnitzel (empty) ../configfile +XXXXXXXXXX.XXXXXX test_set a,c,b (empty) ../configfile XXXXXXXXXX.XXXXXX test_set (empty) \x2d ../configfile #close XXXX-XX-XX-XX-XX-XX diff --git a/testing/btest/scripts/base/frameworks/config/basic.zeek b/testing/btest/scripts/base/frameworks/config/basic.zeek index 384d4a3303..c4dd75a6c5 100644 --- a/testing/btest/scripts/base/frameworks/config/basic.zeek +++ b/testing/btest/scripts/base/frameworks/config/basic.zeek @@ -27,6 +27,7 @@ testsub [2607:f8b0:4002:801::]/48 testinterval 60 testtime 1507321987 test_set a,b,c,d,erdbeerschnitzel +test_set a,b,c, test_vector 1,2,3,4,5,6 test_set test_set -