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();