Restore ability to detect recursive action invocations

This commit is contained in:
Tom Eastep 2011-01-01 08:58:00 -08:00
parent ed3b336a81
commit 4da682365d

View File

@ -62,10 +62,11 @@ use constant { MAX_MACRO_NEST_LEVEL => 5 };
our $macro_nest_level; our $macro_nest_level;
our @actionstack; our @actionstack;
our %active;
# Action Table # Action Table
# #
# %actions{ actchain => used to eliminate collisions, active => 0|1 - 1 means that the action is in the action stack } # %actions{ actchain => used to eliminate collisions }
# #
our %actions; our %actions;
# #
@ -87,6 +88,7 @@ sub initialize( $ ) {
$family = shift; $family = shift;
%macros = (); %macros = ();
@actionstack = (); @actionstack = ();
%active = ();
$macro_nest_level = 0; $macro_nest_level = 0;
%actions = (); %actions = ();
%usedactions = (); %usedactions = ();
@ -165,7 +167,7 @@ sub new_action( $$ ) {
my ( $action , $type ) = @_; my ( $action , $type ) = @_;
$actions{$action} = { actchain => '', active => 0 }; $actions{$action} = { actchain => '' };
$targets{$action} = $type; $targets{$action} = $type;
} }
@ -676,6 +678,9 @@ sub process_action( $) {
my $oldparms = push_params( $param ); my $oldparms = push_params( $param );
$active{$wholeaction}++;
push @actionstack, $action;
while ( read_a_line ) { while ( read_a_line ) {
my ($target, $source, $dest, $proto, $ports, $sports, $origdest, $rate, $user, $mark, $connlimit, $time, $headers ); my ($target, $source, $dest, $proto, $ports, $sports, $origdest, $rate, $user, $mark, $connlimit, $time, $headers );
@ -718,6 +723,9 @@ sub process_action( $) {
clear_comment; clear_comment;
$active{$wholeaction}--;
pop @actionstack;
pop_open; pop_open;
pop_params( $oldparms ); pop_params( $oldparms );
@ -956,7 +964,7 @@ sub process_rule1 ( $$$$$$$$$$$$$$$$ ) {
# #
$normalized_target = normalize_action( $basictarget, $loglevel, $param ); $normalized_target = normalize_action( $basictarget, $loglevel, $param );
fatal_error( "Action $basictarget invoked Recursively (" . join( '->', @actionstack, $basictarget ) . ')' ) if $actions{$basictarget}{active}; fatal_error( "Action $basictarget invoked Recursively (" . join( '->', @actionstack , $basictarget ) . ')' ) if $active{$normalized_target};
if ( my $ref = use_action( $normalized_target ) ) { if ( my $ref = use_action( $normalized_target ) ) {
# #