Using pcre (with JIT) instead of pcrecpp

This commit is contained in:
Felipe Zimmerle 2015-09-17 19:26:44 -03:00
parent ed86c24df6
commit 2451bf05d7
4 changed files with 25 additions and 18 deletions

View File

@ -29,8 +29,7 @@ namespace operators {
bool Rx::evaluate(Assay *assay, const std::string& input) {
SMatch match;
Regex re(MacroExpansion::expand(param, assay));
if (regex_search(input, &match, re) && match.size() >= 1) {
if (regex_search(input, &match, *m_re) && match.size() >= 1) {
this->matched.push_back(match.match);
return true;
}

View File

@ -36,13 +36,17 @@ class Rx : public Operator {
/** @ingroup ModSecurity_Operator */
Rx(std::string op, std::string param, bool negation)
: Operator(op, param, negation),
m_param(param) { }
m_param(param) {
Regex r(param);
m_re = &r;
}
bool evaluate(Assay *assay, const std::string &input);
std::list<std::string> matched;
private:
std::string m_param;
Regex *m_re;
};

View File

@ -15,7 +15,7 @@
#include "utils/regex.h"
#include <pcrecpp.h>
#include <pcre.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
@ -33,28 +33,28 @@ namespace Utils {
Regex::Regex(const std::string& pattern_)
: pattern(pattern_) {
const char *errptr = NULL;
int erroffset;
if (pattern.empty() == true) {
pattern.assign(".*");
}
m_pc = pcre_compile(pattern.c_str(), PCRE_DOTALL|PCRE_MULTILINE, &errptr, &erroffset, NULL);
m_pce = pcre_study(m_pc, PCRE_STUDY_JIT_COMPILE, &errptr);
}
int regex_search(const std::string& s, SMatch *match,
const Regex& regex) {
std::string m;
pcrecpp::RE re(regex.pattern,
pcrecpp::RE_Options(PCRE_DOTALL|PCRE_MULTILINE));
/** FIXME: Should be not necessary to call PartialMatch twice here. */
match->size_ = re.PartialMatch(s);
re.PartialMatch(s, &m);
match->match = m;
return match->size_;
int *ovector = 0;
int ovecsize = 0;
return pcre_exec(regex.m_pc, regex.m_pce, s.c_str(), s.size(), 0, 0, ovector, ovecsize) > 0;
}
int regex_search(const std::string& s, Regex regex) {
pcrecpp::RE re(regex.pattern);
return re.PartialMatch(s);
int regex_search(const std::string& s, const Regex& regex) {
int *ovector = 0;
int ovecsize = 0;
return pcre_exec(regex.m_pc, regex.m_pce, s.c_str(), s.size(), 0, 0, ovector, ovecsize) > 0;
}
} // namespace Utils

View File

@ -16,6 +16,7 @@
#include <iostream>
#include <fstream>
#include <string>
#include <pcre.h>
#ifndef SRC_UTILS_REGEX_H_
#define SRC_UTILS_REGEX_H_
@ -29,6 +30,9 @@ class Regex {
public:
explicit Regex(const std::string& pattern_);
std::string pattern;
pcre *m_pc = NULL;
pcre_extra *m_pce = NULL;
};
@ -44,7 +48,7 @@ class SMatch {
int regex_search(const std::string& s, SMatch *m,
const Regex& regex);
int regex_search(const std::string& s, Regex r);
int regex_search(const std::string& s, const Regex& r);