mirror of
https://github.com/owasp-modsecurity/ModSecurity.git
synced 2025-08-14 05:45:59 +03:00
Using pcre (with JIT) instead of pcrecpp
This commit is contained in:
parent
ed86c24df6
commit
2451bf05d7
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user