mirror of
https://github.com/fwbuilder/fwbuilder
synced 2026-09-12 08:02:00 +02:00
see #2191 "Crash when compiling a route with table object". Compiler
for PF crashed when run-time AddressTable object was used in RDst of a routing rule.
This commit is contained in:
@@ -1,5 +1,10 @@
|
|||||||
2011-07-07 Vadim Kurland <vadim@netcitadel.com>
|
2011-07-07 Vadim Kurland <vadim@netcitadel.com>
|
||||||
|
|
||||||
|
* RoutingCompiler.cpp (processNext): see #2191 "Crash when
|
||||||
|
compiling a route with table object". Compiler for PF crashed
|
||||||
|
when run-time AddressTable object was used in RDst of a routing
|
||||||
|
rule.
|
||||||
|
|
||||||
* PFImporter.cpp (makeAddressObj): see #2546 "PF import - negation
|
* PFImporter.cpp (makeAddressObj): see #2546 "PF import - negation
|
||||||
inside of inline tables is ignored". Since we can not import
|
inside of inline tables is ignored". Since we can not import
|
||||||
address lists or tables that contain a mix of negated and
|
address lists or tables that contain a mix of negated and
|
||||||
|
|||||||
@@ -32,6 +32,7 @@
|
|||||||
|
|
||||||
#include "RoutingCompiler.h"
|
#include "RoutingCompiler.h"
|
||||||
|
|
||||||
|
#include "fwbuilder/AddressTable.h"
|
||||||
#include "fwbuilder/AddressRange.h"
|
#include "fwbuilder/AddressRange.h"
|
||||||
#include "fwbuilder/RuleElement.h"
|
#include "fwbuilder/RuleElement.h"
|
||||||
#include "fwbuilder/Network.h"
|
#include "fwbuilder/Network.h"
|
||||||
@@ -53,6 +54,7 @@
|
|||||||
#include "fwbuilder/XMLTools.h"
|
#include "fwbuilder/XMLTools.h"
|
||||||
#include "fwbuilder/FWException.h"
|
#include "fwbuilder/FWException.h"
|
||||||
#include "fwbuilder/Group.h"
|
#include "fwbuilder/Group.h"
|
||||||
|
#include "fwbuilder/MultiAddress.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
@@ -831,4 +833,35 @@ bool RoutingCompiler::createSortedDstIdsLabel::processNext()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is identical to
|
||||||
|
* PolicyCompiler_ipf::processMultiAddressObjectsInRE::processNext()
|
||||||
|
* TODO: move the code to the class Compiler so it can be reused.
|
||||||
|
*/
|
||||||
|
bool RoutingCompiler::processMultiAddressObjectsInRE::processNext()
|
||||||
|
{
|
||||||
|
RoutingRule *rule = getNext(); if (rule==NULL) return false;
|
||||||
|
RuleElement *re = RuleElement::cast( rule->getFirstByType(re_type) );
|
||||||
|
|
||||||
|
for (FWObject::iterator i=re->begin(); i!=re->end(); i++)
|
||||||
|
{
|
||||||
|
FWObject *o= *i;
|
||||||
|
if (FWReference::cast(o)!=NULL) o=FWReference::cast(o)->getPointer();
|
||||||
|
MultiAddressRunTime *atrt = MultiAddressRunTime::cast(o);
|
||||||
|
if (atrt!=NULL && atrt->getSubstitutionTypeName()==AddressTable::TYPENAME)
|
||||||
|
compiler->abort(
|
||||||
|
rule,
|
||||||
|
"Run-time AddressTable objects are not supported.");
|
||||||
|
|
||||||
|
AddressTable *at = AddressTable::cast(o);
|
||||||
|
if (at && at->isRunTime())
|
||||||
|
compiler->abort(
|
||||||
|
rule,
|
||||||
|
"Run-time AddressTable objects are not supported.");
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp_queue.push_back(rule);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -230,6 +230,26 @@ namespace fwcompiler
|
|||||||
};
|
};
|
||||||
friend class RoutingCompiler::classifyRoutingRules;
|
friend class RoutingCompiler::classifyRoutingRules;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Placeholders for MultiAddressRunTime objects
|
||||||
|
*/
|
||||||
|
class processMultiAddressObjectsInRE : public RoutingRuleProcessor
|
||||||
|
{
|
||||||
|
std::string re_type;
|
||||||
|
public:
|
||||||
|
processMultiAddressObjectsInRE(const std::string &name,
|
||||||
|
const std::string &t) : RoutingRuleProcessor(name) { re_type=t; }
|
||||||
|
virtual bool processNext();
|
||||||
|
};
|
||||||
|
|
||||||
|
class processMultiAddressObjectsInRDst : public processMultiAddressObjectsInRE
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
processMultiAddressObjectsInRDst(const std::string &n) :
|
||||||
|
processMultiAddressObjectsInRE(
|
||||||
|
n, libfwbuilder::RuleElementRDst::TYPENAME) {}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* detects if rules r1 and r2 are identical (that is, have the
|
* detects if rules r1 and r2 are identical (that is, have the
|
||||||
* same effect, rather than use the same objects)
|
* same effect, rather than use the same objects)
|
||||||
|
|||||||
@@ -207,6 +207,9 @@ void RoutingCompiler_openbsd::compile()
|
|||||||
|
|
||||||
add(new addressRangesInDst("process address ranges"));
|
add(new addressRangesInDst("process address ranges"));
|
||||||
|
|
||||||
|
add( new processMultiAddressObjectsInRDst(
|
||||||
|
"process MultiAddress objects in RDst") );
|
||||||
|
|
||||||
//add(new eliminateDuplicatesInDST("Eliminate duplicates in DST"));
|
//add(new eliminateDuplicatesInDST("Eliminate duplicates in DST"));
|
||||||
|
|
||||||
add(new FindDefaultRoute("Find rules that install default route"));
|
add(new FindDefaultRoute("Find rules that install default route"));
|
||||||
|
|||||||
Reference in New Issue
Block a user