You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by he...@apache.org on 2018/10/07 09:56:17 UTC

svn commit: r1843053 - /spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm

Author: hege
Date: Sun Oct  7 09:56:17 2018
New Revision: 1843053

URL: http://svn.apache.org/viewvc?rev=1843053&view=rev
Log:
Optimize regex validation

Modified:
    spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm?rev=1843053&r1=1843052&r2=1843053&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm Sun Oct  7 09:56:17 2018
@@ -1326,41 +1326,48 @@ sub is_meta_valid {
 sub is_delimited_regexp_valid {
   my ($self, $name, $re) = @_;
 
-  if (!$re || $re !~ /^\s*m?(\W).*(?:\1|>|}|\)|\])[a-z]*\s*$/) {
-    $re ||= '';
-    $self->lint_warn("config: invalid regexp for rule $name: $re: missing or invalid delimiters\n", $name);
+  local ($1,$2);
+  $re ||= '';
+  # Check most common delimiter format first
+  # Make re/mods args here for is_regexp_valid, so it doesn't need to again
+  if ($re =~ m!^/(.*)/([a-z]*)$!) {
+      return $self->is_regexp_valid($name, $1, $2, $re);
+  }
+  # Check other delimiters
+  if ($re !~ /^m([\W]).*(?:\1|>|}|\)|\])[a-z]*$/) {
+    $self->lint_warn("config: invalid regexp for rule $name: $re: missing or invalid delimiters\n");
     return 0;
   }
   return $self->is_regexp_valid($name, $re);
 }
 
 sub is_regexp_valid {
-  my ($self, $name, $re) = @_;
+  my ($self, $name, $re, $mods, $origre) = @_;
 
   # OK, try to remove any normal perl-style regexp delimiters at
   # the start and end, and modifiers at the end if present,
   # so we can validate those too.
-  my $origre = $re;
-  my $safere = $re;
-  my $mods = '';
-  local ($1,$2);
-  if ($re =~ s/^m\{//) {
-    $re =~ s/\}([a-z]*)\z//; $mods = $1;
-  }
-  elsif ($re =~ s/^m\(//) {
-    $re =~ s/\)([a-z]*)\z//; $mods = $1;
-  }
-  elsif ($re =~ s/^m<//) {
-    $re =~ s/>([a-z]*)\z//; $mods = $1;
-  }
-  elsif ($re =~ s/^m(\W)//) {
-    $re =~ s/\Q$1\E([a-z]*)\z//; $mods = $1;
-  }
-  elsif ($re =~ s{^/(.*)/([a-z]*)\z}{$1}) {
-    $mods = $2;
-  }
-  else {
-    $safere = "m#".$re."#";
+  if (!defined $origre) {
+    local ($1,$2);
+    $origre = $re;
+    if ($re =~ s{^/(.*)/([a-z]*)\z}{$1}) {
+      $mods = $2;
+    }
+    elsif ($re =~ s/^m\{// && $re =~ s/\}([a-z]*)\z//) {
+      $mods = $1;
+    }
+    elsif ($re =~ s/^m\[// && $re =~ s/\]([a-z]*)\z//) {
+      $mods = $1;
+    }
+    elsif ($re =~ s/^m\(// && $re =~ s/\)([a-z]*)\z//) {
+      $mods = $1;
+    }
+    elsif ($re =~ s/^m<// && $re =~ s/>([a-z]*)\z//) {
+      $mods = $1;
+    }
+    elsif ($re =~ s/^m(\W)(.*)\1([a-z]*)\z/$2/) {
+      $mods = $3;
+    }
   }
 
   if ($self->{conf}->{lint_rules} ||