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*) +';
+