mirror of
https://github.com/owasp-modsecurity/ModSecurity.git
synced 2025-08-14 05:45:59 +03:00
parser: Fix filename
This commit is contained in:
parent
0669c2e64d
commit
61c11251b6
2
CHANGES
2
CHANGES
@ -1,6 +1,8 @@
|
|||||||
v3.0.4 - YYYY-MMM-DD (to be released)
|
v3.0.4 - YYYY-MMM-DD (to be released)
|
||||||
-------------------------------------
|
-------------------------------------
|
||||||
|
|
||||||
|
- parser: fix parsed file names
|
||||||
|
[@zimmerle]
|
||||||
- Allow empty anchored variable
|
- Allow empty anchored variable
|
||||||
[Issue #2024 - @airween]
|
[Issue #2024 - @airween]
|
||||||
- Fixed FILES_NAMES collection after the end of multipart parsing
|
- Fixed FILES_NAMES collection after the end of multipart parsing
|
||||||
|
@ -138,9 +138,9 @@ int Driver::parse(const std::string &f, const std::string &ref) {
|
|||||||
lastRule = NULL;
|
lastRule = NULL;
|
||||||
loc.push_back(new yy::location());
|
loc.push_back(new yy::location());
|
||||||
if (ref.empty()) {
|
if (ref.empty()) {
|
||||||
this->ref.push_back("<<reference missing or not informed>>");
|
loc.back()->begin.filename = loc.back()->end.filename = new std::string("<<reference missing or not informed>>");
|
||||||
} else {
|
} else {
|
||||||
this->ref.push_back(ref);
|
loc.back()->begin.filename = loc.back()->end.filename = new std::string(ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (f.empty()) {
|
if (f.empty()) {
|
||||||
@ -195,9 +195,7 @@ void Driver::error(const yy::location& l, const std::string& m,
|
|||||||
const std::string& c) {
|
const std::string& c) {
|
||||||
if (m_parserError.tellp() == 0) {
|
if (m_parserError.tellp() == 0) {
|
||||||
m_parserError << "Rules error. ";
|
m_parserError << "Rules error. ";
|
||||||
if (ref.empty() == false) {
|
m_parserError << "File: " << *l.end.filename << ". ";
|
||||||
m_parserError << "File: " << ref.back() << ". ";
|
|
||||||
}
|
|
||||||
m_parserError << "Line: " << l.end.line << ". ";
|
m_parserError << "Line: " << l.end.line << ". ";
|
||||||
m_parserError << "Column: " << l.end.column - 1 << ". ";
|
m_parserError << "Column: " << l.end.column - 1 << ". ";
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <list>
|
#include <list>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifndef SRC_PARSER_DRIVER_H_
|
#ifndef SRC_PARSER_DRIVER_H_
|
||||||
#define SRC_PARSER_DRIVER_H_
|
#define SRC_PARSER_DRIVER_H_
|
||||||
|
|
||||||
@ -50,6 +51,14 @@ typedef struct Driver_t Driver;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* FIXME: There is a memory leak in the filename at yy::location.
|
||||||
|
* The filename should be converted into a shared string to
|
||||||
|
* save memory or be associated with the life cycle of the
|
||||||
|
* driver class.
|
||||||
|
*
|
||||||
|
**/
|
||||||
class Driver : public RulesProperties {
|
class Driver : public RulesProperties {
|
||||||
public:
|
public:
|
||||||
Driver();
|
Driver();
|
||||||
@ -77,7 +86,6 @@ class Driver : public RulesProperties {
|
|||||||
|
|
||||||
std::list<yy::location *> loc;
|
std::list<yy::location *> loc;
|
||||||
|
|
||||||
std::list<std::string> ref;
|
|
||||||
std::string buffer;
|
std::string buffer;
|
||||||
Rule *lastRule;
|
Rule *lastRule;
|
||||||
};
|
};
|
||||||
|
@ -1116,7 +1116,7 @@ namespace yy {
|
|||||||
#line 316 "seclang-parser.yy" // lalr1.cc:788
|
#line 316 "seclang-parser.yy" // lalr1.cc:788
|
||||||
{
|
{
|
||||||
// Initialize the initial location.
|
// Initialize the initial location.
|
||||||
yyla.location.begin.filename = yyla.location.end.filename = &driver.file;
|
yyla.location.begin.filename = yyla.location.end.filename = new std::string(driver.file);
|
||||||
}
|
}
|
||||||
|
|
||||||
#line 1123 "seclang-parser.cc" // lalr1.cc:788
|
#line 1123 "seclang-parser.cc" // lalr1.cc:788
|
||||||
@ -1707,7 +1707,7 @@ namespace yy {
|
|||||||
{
|
{
|
||||||
yylhs.value.as < std::unique_ptr<Operator> > () = std::move(yystack_[0].value.as < std::unique_ptr<Operator> > ());
|
yylhs.value.as < std::unique_ptr<Operator> > () = std::move(yystack_[0].value.as < std::unique_ptr<Operator> > ());
|
||||||
std::string error;
|
std::string error;
|
||||||
if (yylhs.value.as < std::unique_ptr<Operator> > ()->init(driver.ref.back(), &error) == false) {
|
if (yylhs.value.as < std::unique_ptr<Operator> > ()->init(*yystack_[0].location.end.filename, &error) == false) {
|
||||||
driver.error(yystack_[1].location, error);
|
driver.error(yystack_[1].location, error);
|
||||||
YYERROR;
|
YYERROR;
|
||||||
}
|
}
|
||||||
@ -1721,7 +1721,7 @@ namespace yy {
|
|||||||
yylhs.value.as < std::unique_ptr<Operator> > () = std::move(yystack_[0].value.as < std::unique_ptr<Operator> > ());
|
yylhs.value.as < std::unique_ptr<Operator> > () = std::move(yystack_[0].value.as < std::unique_ptr<Operator> > ());
|
||||||
yylhs.value.as < std::unique_ptr<Operator> > ()->m_negation = true;
|
yylhs.value.as < std::unique_ptr<Operator> > ()->m_negation = true;
|
||||||
std::string error;
|
std::string error;
|
||||||
if (yylhs.value.as < std::unique_ptr<Operator> > ()->init(driver.ref.back(), &error) == false) {
|
if (yylhs.value.as < std::unique_ptr<Operator> > ()->init(*yystack_[1].location.end.filename, &error) == false) {
|
||||||
driver.error(yystack_[2].location, error);
|
driver.error(yystack_[2].location, error);
|
||||||
YYERROR;
|
YYERROR;
|
||||||
}
|
}
|
||||||
@ -1734,7 +1734,7 @@ namespace yy {
|
|||||||
{
|
{
|
||||||
OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr<Operator> > (), new operators::Rx(std::move(yystack_[0].value.as < std::unique_ptr<RunTimeString> > ())));
|
OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr<Operator> > (), new operators::Rx(std::move(yystack_[0].value.as < std::unique_ptr<RunTimeString> > ())));
|
||||||
std::string error;
|
std::string error;
|
||||||
if (yylhs.value.as < std::unique_ptr<Operator> > ()->init(driver.ref.back(), &error) == false) {
|
if (yylhs.value.as < std::unique_ptr<Operator> > ()->init(*yystack_[0].location.end.filename, &error) == false) {
|
||||||
driver.error(yystack_[1].location, error);
|
driver.error(yystack_[1].location, error);
|
||||||
YYERROR;
|
YYERROR;
|
||||||
}
|
}
|
||||||
@ -1748,7 +1748,7 @@ namespace yy {
|
|||||||
OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr<Operator> > (), new operators::Rx(std::move(yystack_[0].value.as < std::unique_ptr<RunTimeString> > ())));
|
OPERATOR_CONTAINER(yylhs.value.as < std::unique_ptr<Operator> > (), new operators::Rx(std::move(yystack_[0].value.as < std::unique_ptr<RunTimeString> > ())));
|
||||||
yylhs.value.as < std::unique_ptr<Operator> > ()->m_negation = true;
|
yylhs.value.as < std::unique_ptr<Operator> > ()->m_negation = true;
|
||||||
std::string error;
|
std::string error;
|
||||||
if (yylhs.value.as < std::unique_ptr<Operator> > ()->init(driver.ref.back(), &error) == false) {
|
if (yylhs.value.as < std::unique_ptr<Operator> > ()->init(*yystack_[1].location.end.filename, &error) == false) {
|
||||||
driver.error(yystack_[2].location, error);
|
driver.error(yystack_[2].location, error);
|
||||||
YYERROR;
|
YYERROR;
|
||||||
}
|
}
|
||||||
@ -2063,7 +2063,7 @@ namespace yy {
|
|||||||
/* op */ op,
|
/* op */ op,
|
||||||
/* variables */ v,
|
/* variables */ v,
|
||||||
/* actions */ a,
|
/* actions */ a,
|
||||||
/* file name */ driver.ref.back(),
|
/* file name */ *yystack_[3].location.end.filename,
|
||||||
/* line number */ yystack_[3].location.end.line
|
/* line number */ yystack_[3].location.end.line
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -2087,7 +2087,7 @@ namespace yy {
|
|||||||
/* op */ yystack_[0].value.as < std::unique_ptr<Operator> > ().release(),
|
/* op */ yystack_[0].value.as < std::unique_ptr<Operator> > ().release(),
|
||||||
/* variables */ v,
|
/* variables */ v,
|
||||||
/* actions */ NULL,
|
/* actions */ NULL,
|
||||||
/* file name */ driver.ref.back(),
|
/* file name */ *yystack_[2].location.end.filename,
|
||||||
/* line number */ yystack_[2].location.end.line
|
/* line number */ yystack_[2].location.end.line
|
||||||
);
|
);
|
||||||
if (driver.addSecRule(rule) == false) {
|
if (driver.addSecRule(rule) == false) {
|
||||||
@ -2109,7 +2109,7 @@ namespace yy {
|
|||||||
/* op */ NULL,
|
/* op */ NULL,
|
||||||
/* variables */ NULL,
|
/* variables */ NULL,
|
||||||
/* actions */ a,
|
/* actions */ a,
|
||||||
/* file name */ driver.ref.back(),
|
/* file name */ *yystack_[1].location.end.filename,
|
||||||
/* line number */ yystack_[1].location.end.line
|
/* line number */ yystack_[1].location.end.line
|
||||||
);
|
);
|
||||||
driver.addSecAction(rule);
|
driver.addSecAction(rule);
|
||||||
@ -2128,7 +2128,7 @@ namespace yy {
|
|||||||
RuleScript *r = new RuleScript(
|
RuleScript *r = new RuleScript(
|
||||||
/* path to script */ yystack_[1].value.as < std::string > (),
|
/* path to script */ yystack_[1].value.as < std::string > (),
|
||||||
/* actions */ a,
|
/* actions */ a,
|
||||||
/* file name */ driver.ref.back(),
|
/* file name */ *yystack_[1].location.end.filename,
|
||||||
/* line number */ yystack_[1].location.end.line
|
/* line number */ yystack_[1].location.end.line
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -2721,7 +2721,7 @@ namespace yy {
|
|||||||
#if defined(WITH_GEOIP) or defined(WITH_MAXMIND)
|
#if defined(WITH_GEOIP) or defined(WITH_MAXMIND)
|
||||||
std::string err;
|
std::string err;
|
||||||
std::string file = modsecurity::utils::find_resource(yystack_[0].value.as < std::string > (),
|
std::string file = modsecurity::utils::find_resource(yystack_[0].value.as < std::string > (),
|
||||||
driver.ref.back(), &err);
|
*yystack_[0].location.end.filename, &err);
|
||||||
if (file.empty()) {
|
if (file.empty()) {
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << "Failed to load locate the GeoDB file from: " << yystack_[0].value.as < std::string > () << " ";
|
ss << "Failed to load locate the GeoDB file from: " << yystack_[0].value.as < std::string > () << " ";
|
||||||
@ -2949,7 +2949,7 @@ namespace yy {
|
|||||||
param.pop_back();
|
param.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
file = modsecurity::utils::find_resource(f, driver.ref.back(), &err);
|
file = modsecurity::utils::find_resource(f, *yystack_[0].location.end.filename, &err);
|
||||||
if (file.empty()) {
|
if (file.empty()) {
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << "Failed to locate the unicode map file from: " << f << " ";
|
ss << "Failed to locate the unicode map file from: " << f << " ";
|
||||||
|
@ -315,7 +315,7 @@ using namespace modsecurity::operators;
|
|||||||
%initial-action
|
%initial-action
|
||||||
{
|
{
|
||||||
// Initialize the initial location.
|
// Initialize the initial location.
|
||||||
@$.begin.filename = @$.end.filename = &driver.file;
|
@$.begin.filename = @$.end.filename = new std::string(driver.file);
|
||||||
};
|
};
|
||||||
%define parse.trace
|
%define parse.trace
|
||||||
%define parse.error verbose
|
%define parse.error verbose
|
||||||
@ -866,7 +866,7 @@ op:
|
|||||||
{
|
{
|
||||||
$$ = std::move($1);
|
$$ = std::move($1);
|
||||||
std::string error;
|
std::string error;
|
||||||
if ($$->init(driver.ref.back(), &error) == false) {
|
if ($$->init(*@1.end.filename, &error) == false) {
|
||||||
driver.error(@0, error);
|
driver.error(@0, error);
|
||||||
YYERROR;
|
YYERROR;
|
||||||
}
|
}
|
||||||
@ -876,7 +876,7 @@ op:
|
|||||||
$$ = std::move($2);
|
$$ = std::move($2);
|
||||||
$$->m_negation = true;
|
$$->m_negation = true;
|
||||||
std::string error;
|
std::string error;
|
||||||
if ($$->init(driver.ref.back(), &error) == false) {
|
if ($$->init(*@1.end.filename, &error) == false) {
|
||||||
driver.error(@0, error);
|
driver.error(@0, error);
|
||||||
YYERROR;
|
YYERROR;
|
||||||
}
|
}
|
||||||
@ -885,7 +885,7 @@ op:
|
|||||||
{
|
{
|
||||||
OPERATOR_CONTAINER($$, new operators::Rx(std::move($1)));
|
OPERATOR_CONTAINER($$, new operators::Rx(std::move($1)));
|
||||||
std::string error;
|
std::string error;
|
||||||
if ($$->init(driver.ref.back(), &error) == false) {
|
if ($$->init(*@1.end.filename, &error) == false) {
|
||||||
driver.error(@0, error);
|
driver.error(@0, error);
|
||||||
YYERROR;
|
YYERROR;
|
||||||
}
|
}
|
||||||
@ -895,7 +895,7 @@ op:
|
|||||||
OPERATOR_CONTAINER($$, new operators::Rx(std::move($2)));
|
OPERATOR_CONTAINER($$, new operators::Rx(std::move($2)));
|
||||||
$$->m_negation = true;
|
$$->m_negation = true;
|
||||||
std::string error;
|
std::string error;
|
||||||
if ($$->init(driver.ref.back(), &error) == false) {
|
if ($$->init(*@1.end.filename, &error) == false) {
|
||||||
driver.error(@0, error);
|
driver.error(@0, error);
|
||||||
YYERROR;
|
YYERROR;
|
||||||
}
|
}
|
||||||
@ -1073,7 +1073,7 @@ expression:
|
|||||||
/* op */ op,
|
/* op */ op,
|
||||||
/* variables */ v,
|
/* variables */ v,
|
||||||
/* actions */ a,
|
/* actions */ a,
|
||||||
/* file name */ driver.ref.back(),
|
/* file name */ *@1.end.filename,
|
||||||
/* line number */ @1.end.line
|
/* line number */ @1.end.line
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -1093,7 +1093,7 @@ expression:
|
|||||||
/* op */ $3.release(),
|
/* op */ $3.release(),
|
||||||
/* variables */ v,
|
/* variables */ v,
|
||||||
/* actions */ NULL,
|
/* actions */ NULL,
|
||||||
/* file name */ driver.ref.back(),
|
/* file name */ *@1.end.filename,
|
||||||
/* line number */ @1.end.line
|
/* line number */ @1.end.line
|
||||||
);
|
);
|
||||||
if (driver.addSecRule(rule) == false) {
|
if (driver.addSecRule(rule) == false) {
|
||||||
@ -1111,7 +1111,7 @@ expression:
|
|||||||
/* op */ NULL,
|
/* op */ NULL,
|
||||||
/* variables */ NULL,
|
/* variables */ NULL,
|
||||||
/* actions */ a,
|
/* actions */ a,
|
||||||
/* file name */ driver.ref.back(),
|
/* file name */ *@1.end.filename,
|
||||||
/* line number */ @1.end.line
|
/* line number */ @1.end.line
|
||||||
);
|
);
|
||||||
driver.addSecAction(rule);
|
driver.addSecAction(rule);
|
||||||
@ -1126,7 +1126,7 @@ expression:
|
|||||||
RuleScript *r = new RuleScript(
|
RuleScript *r = new RuleScript(
|
||||||
/* path to script */ $1,
|
/* path to script */ $1,
|
||||||
/* actions */ a,
|
/* actions */ a,
|
||||||
/* file name */ driver.ref.back(),
|
/* file name */ *@1.end.filename,
|
||||||
/* line number */ @1.end.line
|
/* line number */ @1.end.line
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -1525,7 +1525,7 @@ expression:
|
|||||||
#if defined(WITH_GEOIP) or defined(WITH_MAXMIND)
|
#if defined(WITH_GEOIP) or defined(WITH_MAXMIND)
|
||||||
std::string err;
|
std::string err;
|
||||||
std::string file = modsecurity::utils::find_resource($1,
|
std::string file = modsecurity::utils::find_resource($1,
|
||||||
driver.ref.back(), &err);
|
*@1.end.filename, &err);
|
||||||
if (file.empty()) {
|
if (file.empty()) {
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << "Failed to load locate the GeoDB file from: " << $1 << " ";
|
ss << "Failed to load locate the GeoDB file from: " << $1 << " ";
|
||||||
@ -1707,7 +1707,7 @@ expression:
|
|||||||
param.pop_back();
|
param.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
file = modsecurity::utils::find_resource(f, driver.ref.back(), &err);
|
file = modsecurity::utils::find_resource(f, *@1.end.filename, &err);
|
||||||
if (file.empty()) {
|
if (file.empty()) {
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << "Failed to locate the unicode map file from: " << f << " ";
|
ss << "Failed to locate the unicode map file from: " << f << " ";
|
||||||
|
@ -5053,7 +5053,7 @@ static const flex_int16_t yy_rule_linenum[536] =
|
|||||||
1156, 1161, 1163, 1164, 1165, 1166, 1168, 1169, 1170, 1171,
|
1156, 1161, 1163, 1164, 1165, 1166, 1168, 1169, 1170, 1171,
|
||||||
1173, 1174, 1175, 1176, 1178, 1180, 1181, 1183, 1184, 1185,
|
1173, 1174, 1175, 1176, 1178, 1180, 1181, 1183, 1184, 1185,
|
||||||
1186, 1188, 1193, 1194, 1195, 1199, 1200, 1201, 1206, 1208,
|
1186, 1188, 1193, 1194, 1195, 1199, 1200, 1201, 1206, 1208,
|
||||||
1209, 1210, 1235, 1261, 1289
|
1209, 1210, 1229, 1256, 1286
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
/* The intent behind this definition is that it'll catch
|
/* The intent behind this definition is that it'll catch
|
||||||
@ -8419,16 +8419,6 @@ case YY_STATE_EOF(SETVAR_ACTION_QUOTED_WAITING_OPERATION):
|
|||||||
case YY_STATE_EOF(SETVAR_ACTION_QUOTED_WAITING_CONTENT):
|
case YY_STATE_EOF(SETVAR_ACTION_QUOTED_WAITING_CONTENT):
|
||||||
#line 1213 "seclang-scanner.ll"
|
#line 1213 "seclang-scanner.ll"
|
||||||
{
|
{
|
||||||
if (driver.ref.size() > 1) {
|
|
||||||
driver.ref.pop_back();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (driver.loc.size() > 1) {
|
|
||||||
yy::location *l = driver.loc.back();
|
|
||||||
driver.loc.pop_back();
|
|
||||||
delete l;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (yyin) {
|
if (yyin) {
|
||||||
fclose(yyin);
|
fclose(yyin);
|
||||||
}
|
}
|
||||||
@ -8437,15 +8427,19 @@ case YY_STATE_EOF(SETVAR_ACTION_QUOTED_WAITING_CONTENT):
|
|||||||
if (!YY_CURRENT_BUFFER) {
|
if (!YY_CURRENT_BUFFER) {
|
||||||
return p::make_END(*driver.loc.back());
|
return p::make_END(*driver.loc.back());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
yy::location *l = driver.loc.back();
|
||||||
|
driver.loc.pop_back();
|
||||||
|
delete l;
|
||||||
}
|
}
|
||||||
YY_BREAK
|
YY_BREAK
|
||||||
case 533:
|
case 533:
|
||||||
YY_RULE_SETUP
|
YY_RULE_SETUP
|
||||||
#line 1235 "seclang-scanner.ll"
|
#line 1229 "seclang-scanner.ll"
|
||||||
{
|
{
|
||||||
std::string err;
|
std::string err;
|
||||||
const char *file = strchr(yytext, ' ') + 1;
|
const char *file = strchr(yytext, ' ') + 1;
|
||||||
std::string fi = modsecurity::utils::find_resource(file, driver.ref.back(), &err);
|
std::string fi = modsecurity::utils::find_resource(file, *driver.loc.back()->end.filename, &err);
|
||||||
if (fi.empty() == true) {
|
if (fi.empty() == true) {
|
||||||
BEGIN(INITIAL);
|
BEGIN(INITIAL);
|
||||||
driver.error (*driver.loc.back(), "", file + std::string(": Not able to open file. ") + err);
|
driver.error (*driver.loc.back(), "", file + std::string(": Not able to open file. ") + err);
|
||||||
@ -8455,28 +8449,29 @@ YY_RULE_SETUP
|
|||||||
files.reverse();
|
files.reverse();
|
||||||
for (auto& s: files) {
|
for (auto& s: files) {
|
||||||
std::string err;
|
std::string err;
|
||||||
std::string f = modsecurity::utils::find_resource(s, driver.ref.back(), &err);
|
std::string f = modsecurity::utils::find_resource(s, *driver.loc.back()->end.filename, &err);
|
||||||
|
driver.loc.push_back(new yy::location());
|
||||||
|
driver.loc.back()->begin.filename = driver.loc.back()->end.filename = new std::string(f);
|
||||||
yyin = fopen(f.c_str(), "r" );
|
yyin = fopen(f.c_str(), "r" );
|
||||||
if (!yyin) {
|
if (!yyin) {
|
||||||
BEGIN(INITIAL);
|
BEGIN(INITIAL);
|
||||||
|
driver.loc.pop_back();
|
||||||
driver.error (*driver.loc.back(), "", s + std::string(": Not able to open file. ") + err);
|
driver.error (*driver.loc.back(), "", s + std::string(": Not able to open file. ") + err);
|
||||||
throw p::syntax_error(*driver.loc.back(), "");
|
throw p::syntax_error(*driver.loc.back(), "");
|
||||||
}
|
}
|
||||||
driver.ref.push_back(f);
|
|
||||||
driver.loc.push_back(new yy::location());
|
|
||||||
yypush_buffer_state(yy_create_buffer( yyin, YY_BUF_SIZE ));
|
yypush_buffer_state(yy_create_buffer( yyin, YY_BUF_SIZE ));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
YY_BREAK
|
YY_BREAK
|
||||||
case 534:
|
case 534:
|
||||||
YY_RULE_SETUP
|
YY_RULE_SETUP
|
||||||
#line 1261 "seclang-scanner.ll"
|
#line 1256 "seclang-scanner.ll"
|
||||||
{
|
{
|
||||||
std::string err;
|
std::string err;
|
||||||
const char *file = strchr(yytext, ' ') + 1;
|
const char *file = strchr(yytext, ' ') + 1;
|
||||||
char *f = strdup(file + 1);
|
char *f = strdup(file + 1);
|
||||||
f[strlen(f)-1] = '\0';
|
f[strlen(f)-1] = '\0';
|
||||||
std::string fi = modsecurity::utils::find_resource(f, driver.ref.back(), &err);
|
std::string fi = modsecurity::utils::find_resource(f, *driver.loc.back()->end.filename, &err);
|
||||||
if (fi.empty() == true) {
|
if (fi.empty() == true) {
|
||||||
BEGIN(INITIAL);
|
BEGIN(INITIAL);
|
||||||
driver.error (*driver.loc.back(), "", file + std::string(": Not able to open file. ") + err);
|
driver.error (*driver.loc.back(), "", file + std::string(": Not able to open file. ") + err);
|
||||||
@ -8485,15 +8480,17 @@ YY_RULE_SETUP
|
|||||||
std::list<std::string> files = modsecurity::utils::expandEnv(fi, 0);
|
std::list<std::string> files = modsecurity::utils::expandEnv(fi, 0);
|
||||||
files.reverse();
|
files.reverse();
|
||||||
for (auto& s: files) {
|
for (auto& s: files) {
|
||||||
std::string f = modsecurity::utils::find_resource(s, driver.ref.back(), &err);
|
std::string f = modsecurity::utils::find_resource(s, *driver.loc.back()->end.filename, &err);
|
||||||
|
driver.loc.push_back(new yy::location());
|
||||||
|
driver.loc.back()->begin.filename = driver.loc.back()->end.filename = new std::string(f);
|
||||||
|
|
||||||
yyin = fopen(f.c_str(), "r" );
|
yyin = fopen(f.c_str(), "r" );
|
||||||
if (!yyin) {
|
if (!yyin) {
|
||||||
BEGIN(INITIAL);
|
BEGIN(INITIAL);
|
||||||
|
driver.loc.pop_back();
|
||||||
driver.error (*driver.loc.back(), "", s + std::string(": Not able to open file. ") + err);
|
driver.error (*driver.loc.back(), "", s + std::string(": Not able to open file. ") + err);
|
||||||
throw p::syntax_error(*driver.loc.back(), "");
|
throw p::syntax_error(*driver.loc.back(), "");
|
||||||
}
|
}
|
||||||
driver.ref.push_back(f.c_str());
|
|
||||||
driver.loc.push_back(new yy::location());
|
|
||||||
yypush_buffer_state(yy_create_buffer( yyin, YY_BUF_SIZE ));
|
yypush_buffer_state(yy_create_buffer( yyin, YY_BUF_SIZE ));
|
||||||
}
|
}
|
||||||
free(f);
|
free(f);
|
||||||
@ -8502,7 +8499,7 @@ YY_RULE_SETUP
|
|||||||
case 535:
|
case 535:
|
||||||
/* rule 535 can match eol */
|
/* rule 535 can match eol */
|
||||||
YY_RULE_SETUP
|
YY_RULE_SETUP
|
||||||
#line 1289 "seclang-scanner.ll"
|
#line 1286 "seclang-scanner.ll"
|
||||||
{
|
{
|
||||||
HttpsClient c;
|
HttpsClient c;
|
||||||
std::string key;
|
std::string key;
|
||||||
@ -8517,8 +8514,8 @@ YY_RULE_SETUP
|
|||||||
url = conf[2];
|
url = conf[2];
|
||||||
c.setKey(key);
|
c.setKey(key);
|
||||||
|
|
||||||
driver.ref.push_back(url);
|
|
||||||
driver.loc.push_back(new yy::location());
|
driver.loc.push_back(new yy::location());
|
||||||
|
driver.loc.back()->begin.filename = driver.loc.back()->end.filename = new std::string(url);
|
||||||
YY_BUFFER_STATE temp = YY_CURRENT_BUFFER;
|
YY_BUFFER_STATE temp = YY_CURRENT_BUFFER;
|
||||||
yypush_buffer_state(temp);
|
yypush_buffer_state(temp);
|
||||||
|
|
||||||
@ -8540,10 +8537,10 @@ YY_RULE_SETUP
|
|||||||
YY_BREAK
|
YY_BREAK
|
||||||
case 536:
|
case 536:
|
||||||
YY_RULE_SETUP
|
YY_RULE_SETUP
|
||||||
#line 1325 "seclang-scanner.ll"
|
#line 1322 "seclang-scanner.ll"
|
||||||
ECHO;
|
ECHO;
|
||||||
YY_BREAK
|
YY_BREAK
|
||||||
#line 8546 "seclang-scanner.cc"
|
#line 8543 "seclang-scanner.cc"
|
||||||
|
|
||||||
case YY_END_OF_BUFFER:
|
case YY_END_OF_BUFFER:
|
||||||
{
|
{
|
||||||
@ -9648,7 +9645,7 @@ void yyfree (void * ptr )
|
|||||||
|
|
||||||
/* %ok-for-header */
|
/* %ok-for-header */
|
||||||
|
|
||||||
#line 1325 "seclang-scanner.ll"
|
#line 1322 "seclang-scanner.ll"
|
||||||
|
|
||||||
|
|
||||||
namespace modsecurity {
|
namespace modsecurity {
|
||||||
|
@ -1210,16 +1210,6 @@ EQUALS_MINUS (?i:=\-)
|
|||||||
|
|
||||||
|
|
||||||
<<EOF>> {
|
<<EOF>> {
|
||||||
if (driver.ref.size() > 1) {
|
|
||||||
driver.ref.pop_back();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (driver.loc.size() > 1) {
|
|
||||||
yy::location *l = driver.loc.back();
|
|
||||||
driver.loc.pop_back();
|
|
||||||
delete l;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (yyin) {
|
if (yyin) {
|
||||||
fclose(yyin);
|
fclose(yyin);
|
||||||
}
|
}
|
||||||
@ -1228,13 +1218,17 @@ EQUALS_MINUS (?i:=\-)
|
|||||||
if (!YY_CURRENT_BUFFER) {
|
if (!YY_CURRENT_BUFFER) {
|
||||||
return p::make_END(*driver.loc.back());
|
return p::make_END(*driver.loc.back());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
yy::location *l = driver.loc.back();
|
||||||
|
driver.loc.pop_back();
|
||||||
|
delete l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
{CONFIG_INCLUDE}[ \t]+{CONFIG_VALUE_PATH} {
|
{CONFIG_INCLUDE}[ \t]+{CONFIG_VALUE_PATH} {
|
||||||
std::string err;
|
std::string err;
|
||||||
const char *file = strchr(yytext, ' ') + 1;
|
const char *file = strchr(yytext, ' ') + 1;
|
||||||
std::string fi = modsecurity::utils::find_resource(file, driver.ref.back(), &err);
|
std::string fi = modsecurity::utils::find_resource(file, *driver.loc.back()->end.filename, &err);
|
||||||
if (fi.empty() == true) {
|
if (fi.empty() == true) {
|
||||||
BEGIN(INITIAL);
|
BEGIN(INITIAL);
|
||||||
driver.error (*driver.loc.back(), "", file + std::string(": Not able to open file. ") + err);
|
driver.error (*driver.loc.back(), "", file + std::string(": Not able to open file. ") + err);
|
||||||
@ -1244,15 +1238,16 @@ EQUALS_MINUS (?i:=\-)
|
|||||||
files.reverse();
|
files.reverse();
|
||||||
for (auto& s: files) {
|
for (auto& s: files) {
|
||||||
std::string err;
|
std::string err;
|
||||||
std::string f = modsecurity::utils::find_resource(s, driver.ref.back(), &err);
|
std::string f = modsecurity::utils::find_resource(s, *driver.loc.back()->end.filename, &err);
|
||||||
|
driver.loc.push_back(new yy::location());
|
||||||
|
driver.loc.back()->begin.filename = driver.loc.back()->end.filename = new std::string(f);
|
||||||
yyin = fopen(f.c_str(), "r" );
|
yyin = fopen(f.c_str(), "r" );
|
||||||
if (!yyin) {
|
if (!yyin) {
|
||||||
BEGIN(INITIAL);
|
BEGIN(INITIAL);
|
||||||
|
driver.loc.pop_back();
|
||||||
driver.error (*driver.loc.back(), "", s + std::string(": Not able to open file. ") + err);
|
driver.error (*driver.loc.back(), "", s + std::string(": Not able to open file. ") + err);
|
||||||
throw p::syntax_error(*driver.loc.back(), "");
|
throw p::syntax_error(*driver.loc.back(), "");
|
||||||
}
|
}
|
||||||
driver.ref.push_back(f);
|
|
||||||
driver.loc.push_back(new yy::location());
|
|
||||||
yypush_buffer_state(yy_create_buffer( yyin, YY_BUF_SIZE ));
|
yypush_buffer_state(yy_create_buffer( yyin, YY_BUF_SIZE ));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1262,7 +1257,7 @@ EQUALS_MINUS (?i:=\-)
|
|||||||
const char *file = strchr(yytext, ' ') + 1;
|
const char *file = strchr(yytext, ' ') + 1;
|
||||||
char *f = strdup(file + 1);
|
char *f = strdup(file + 1);
|
||||||
f[strlen(f)-1] = '\0';
|
f[strlen(f)-1] = '\0';
|
||||||
std::string fi = modsecurity::utils::find_resource(f, driver.ref.back(), &err);
|
std::string fi = modsecurity::utils::find_resource(f, *driver.loc.back()->end.filename, &err);
|
||||||
if (fi.empty() == true) {
|
if (fi.empty() == true) {
|
||||||
BEGIN(INITIAL);
|
BEGIN(INITIAL);
|
||||||
driver.error (*driver.loc.back(), "", file + std::string(": Not able to open file. ") + err);
|
driver.error (*driver.loc.back(), "", file + std::string(": Not able to open file. ") + err);
|
||||||
@ -1271,15 +1266,17 @@ EQUALS_MINUS (?i:=\-)
|
|||||||
std::list<std::string> files = modsecurity::utils::expandEnv(fi, 0);
|
std::list<std::string> files = modsecurity::utils::expandEnv(fi, 0);
|
||||||
files.reverse();
|
files.reverse();
|
||||||
for (auto& s: files) {
|
for (auto& s: files) {
|
||||||
std::string f = modsecurity::utils::find_resource(s, driver.ref.back(), &err);
|
std::string f = modsecurity::utils::find_resource(s, *driver.loc.back()->end.filename, &err);
|
||||||
|
driver.loc.push_back(new yy::location());
|
||||||
|
driver.loc.back()->begin.filename = driver.loc.back()->end.filename = new std::string(f);
|
||||||
|
|
||||||
yyin = fopen(f.c_str(), "r" );
|
yyin = fopen(f.c_str(), "r" );
|
||||||
if (!yyin) {
|
if (!yyin) {
|
||||||
BEGIN(INITIAL);
|
BEGIN(INITIAL);
|
||||||
|
driver.loc.pop_back();
|
||||||
driver.error (*driver.loc.back(), "", s + std::string(": Not able to open file. ") + err);
|
driver.error (*driver.loc.back(), "", s + std::string(": Not able to open file. ") + err);
|
||||||
throw p::syntax_error(*driver.loc.back(), "");
|
throw p::syntax_error(*driver.loc.back(), "");
|
||||||
}
|
}
|
||||||
driver.ref.push_back(f.c_str());
|
|
||||||
driver.loc.push_back(new yy::location());
|
|
||||||
yypush_buffer_state(yy_create_buffer( yyin, YY_BUF_SIZE ));
|
yypush_buffer_state(yy_create_buffer( yyin, YY_BUF_SIZE ));
|
||||||
}
|
}
|
||||||
free(f);
|
free(f);
|
||||||
@ -1299,8 +1296,8 @@ EQUALS_MINUS (?i:=\-)
|
|||||||
url = conf[2];
|
url = conf[2];
|
||||||
c.setKey(key);
|
c.setKey(key);
|
||||||
|
|
||||||
driver.ref.push_back(url);
|
|
||||||
driver.loc.push_back(new yy::location());
|
driver.loc.push_back(new yy::location());
|
||||||
|
driver.loc.back()->begin.filename = driver.loc.back()->end.filename = new std::string(url);
|
||||||
YY_BUFFER_STATE temp = YY_CURRENT_BUFFER;
|
YY_BUFFER_STATE temp = YY_CURRENT_BUFFER;
|
||||||
yypush_buffer_state(temp);
|
yypush_buffer_state(temp);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user