You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by jm...@apache.org on 2009/09/20 21:34:55 UTC
svn commit: r817085 - in /spamassassin/trunk: MANIFEST
lib/Mail/SpamAssassin/Conf.pm lib/Mail/SpamAssassin/Conf/Parser.pm
t/stop_always_matching_regexps.t
Author: jm
Date: Sun Sep 20 19:34:54 2009
New Revision: 817085
URL: http://svn.apache.org/viewvc?rev=817085&view=rev
Log:
bug 5712: initial fix to detect accidental match-everything regexps in rules, thanks to Matt Cline
Added:
spamassassin/trunk/t/stop_always_matching_regexps.t
Modified:
spamassassin/trunk/MANIFEST
spamassassin/trunk/lib/Mail/SpamAssassin/Conf.pm
spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm
Modified: spamassassin/trunk/MANIFEST
URL: http://svn.apache.org/viewvc/spamassassin/trunk/MANIFEST?rev=817085&r1=817084&r2=817085&view=diff
==============================================================================
--- spamassassin/trunk/MANIFEST (original)
+++ spamassassin/trunk/MANIFEST Sun Sep 20 19:34:54 2009
@@ -516,3 +516,4 @@
t/zz_cleanup.t
t/spamd_whitelist_leak.t
t/db_awl_perms.t
+t/stop_always_matching_regexps.t
Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Conf.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Conf.pm?rev=817085&r1=817084&r2=817085&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Conf.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Conf.pm Sun Sep 20 19:34:54 2009
@@ -3018,6 +3018,21 @@
}
});
+=item ignore_always_matching_regexps (Default: 0)
+
+Ignore any rule which contains a regexp which always matches.
+Currently only catches regexps which contain '||', or which begin or
+end with a '|'. Also ignore rules with C<some> combinatorial explosions.
+
+=cut
+
+ push (@cmds, {
+ setting => 'ignore_always_matching_regexps',
+ is_admin => 1,
+ default => 0,
+ type => $CONF_TYPE_BOOL
+ });
+
=back
=head1 PREPROCESSING OPTIONS
Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm?rev=817085&r1=817084&r2=817085&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm Sun Sep 20 19:34:54 2009
@@ -1197,6 +1197,21 @@
$safere = "m#".$re."#";
}
+ if ($self->{conf}->{lint_rules} ||
+ $self->{conf}->{ignore_always_matching_regexps})
+ {
+ my $msg = $self->is_always_matching_regexp($name, $re);
+
+ if (defined $msg) {
+ if ($self->{conf}->{lint_rules}) {
+ $self->lint_warn($msg, $name);
+ } else {
+ warn $msg;
+ return 0;
+ }
+ }
+ }
+
# now prepend the modifiers, in order to check if they're valid
if ($mods) {
$re = "(?".$mods.")".$re;
@@ -1215,6 +1230,24 @@
return 0;
}
+# check the pattern for some basic errors, and warn if found
+sub is_always_matching_regexp {
+ my ($self, $name, $re) = @_;
+
+ if ($re =~ /(?<!\\)\|\|/) {
+ return "config: regexp for rule $name always matches due to '||'";
+ }
+ elsif ($re =~ /^\|/) {
+ return "config: regexp for rule $name always matches due to " .
+ "pattern starting with '|'";
+ }
+ elsif ($re =~ /\|(?<!\\\|)$/) {
+ return "config: regexp for rule $name always matches due to " .
+ "pattern ending with '|'";
+ }
+ return;
+}
+
###########################################################################
sub add_to_addrlist {
Added: spamassassin/trunk/t/stop_always_matching_regexps.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/stop_always_matching_regexps.t?rev=817085&view=auto
==============================================================================
--- spamassassin/trunk/t/stop_always_matching_regexps.t (added)
+++ spamassassin/trunk/t/stop_always_matching_regexps.t Sun Sep 20 19:34:54 2009
@@ -0,0 +1,47 @@
+#!/usr/bin/perl
+
+BEGIN {
+ if (-e 't/test_dir') { # if we are running "t/rule_tests.t", kluge around ...
+ chdir 't';
+ }
+
+ if (-e 'test_dir') { # running from test directory, not ..
+ unshift(@INC, '../blib/lib');
+ unshift(@INC, '../lib');
+ }
+}
+
+use lib '.'; use lib 't';
+use SATest; sa_t_init("stop_always_matching_regexps");
+use Test; BEGIN { plan tests => 13 };
+
+# ---------------------------------------------------------------------------
+
+use strict;
+require Mail::SpamAssassin;
+
+my $sa = create_saobj({'dont_copy_prefs' => 1});
+$sa->init(0);
+ok($sa);
+
+sub is_caught {
+ my ($re) = @_;
+ return $sa->{conf}->{parser}->is_always_matching_regexp($re, $re);
+}
+
+ok !is_caught 'foo|bar';
+ok is_caught 'foo||bar';
+ok is_caught '|bar';
+ok is_caught 'foo|';
+ok !is_caught 'foo\||bar';
+ok !is_caught '\||bar';
+
+ok !is_caught '(foo|bar)baz';
+ok is_caught '(foo||bar)baz';
+ok !is_caught '(|bar)baz';
+ok !is_caught '(foo|)baz';
+ok !is_caught '(foo\||bar)baz';
+ok !is_caught '(\||bar)baz';
+
+# ok is_caught '(\s*) +';
+