Accurately compare rule key values that are array references.

Signed-off-by: Tom Eastep <teastep@shorewall.net>
This commit is contained in:
Tom Eastep 2011-11-26 08:03:02 -08:00
parent 15d95b6977
commit 3498076a96

View File

@ -1146,6 +1146,24 @@ sub push_irule( $$$;@ ) {
$ruleref; $ruleref;
} }
#
# Compare two rule hash values. If a value is a reference, then it will be an array reference
#
sub compare_values( $$ ) {
my ( $value1, $value2 ) = @_;
return $value1 eq $value2 unless reftype $value1;
if ( reftype $value2 && @$value1 == @$value2 ) {
my $offset = 0;
for ( @$value1 ) {
return 0 unless $_ eq $value2->[$offset++];
}
1;
}
}
sub add_irule( $;@ ) { sub add_irule( $;@ ) {
my ( $chainref, @matches ) = @_; my ( $chainref, @matches ) = @_;
@ -2953,7 +2971,7 @@ sub combine_dports {
for my $key ( @keys1 ) { for my $key ( @keys1 ) {
last RULE unless $key eq $keys2[$keynum++]; last RULE unless $key eq $keys2[$keynum++];
next if $baseref->{$key} eq $ruleref->{$key}; next if compare_values( $baseref->{$key}, $ruleref->{$key} );
last RULE unless $key eq 'multiport' && $multi_sports eq get_multi_sports( $ruleref ); last RULE unless $key eq 'multiport' && $multi_sports eq get_multi_sports( $ruleref );
} }