diff --git a/CHANGES b/CHANGES index 456c924b56..563f72533f 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,9 @@ +5.1.0-dev.265 | 2022-07-18 08:54:30 -0700 + + * GH-636: Fix regex to handle commas at the end of config parser lines (Tim Wojtulewicz, Corelight) + + * Convert config framework to use std::regex (Tim Wojtulewicz, Corelight) + 5.1.0-dev.261 | 2022-07-14 15:46:29 -0700 * Management framework: fix an agent boot-time race condition plus minor tweaks (Christian Kreibich, Corelight) diff --git a/VERSION b/VERSION index 86f87a61bf..c3d10fe8df 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -5.1.0-dev.261 +5.1.0-dev.265 diff --git a/src/input/readers/config/Config.cc b/src/input/readers/config/Config.cc index e019008f81..bc50a52768 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,34 @@ 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.")); + 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 ) + { + 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 +289,6 @@ bool Config::DoUpdate() } } - regfree(&re); - if ( Info().mode != MODE_STREAM ) EndCurrentSend(); 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 -