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 2022/05/28 11:00:42 UTC

svn commit: r1901347 - in /spamassassin/trunk/lib/Mail/SpamAssassin: Conf/Parser.pm Plugin/Check.pm

Author: hege
Date: Sat May 28 11:00:42 2022
New Revision: 1901347

URL: http://svn.apache.org/viewvc?rev=1901347&view=rev
Log:
Fix Unescaped left brace for %{FOO} templates (Bug 7992)

Modified:
    spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm
    spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/Check.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=1901347&r1=1901346&r2=1901347&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm Sat May 28 11:00:42 2022
@@ -1332,13 +1332,13 @@ sub add_test {
       $type == $Mail::SpamAssassin::Conf::TYPE_RAWBODY_TESTS ||
       $type == $Mail::SpamAssassin::Conf::TYPE_FULL_TESTS)
   {
+    $self->parse_captures($name, \$text);
     my ($rec, $err) = compile_regexp($text, 1, $ignore_amre);
     if (!$rec) {
       $self->lint_warn("config: invalid regexp for $name '$text': $err", $name);
       return;
     }
     $conf->{test_qrs}->{$name} = $rec;
-    $self->parse_captures($name, $rec);
   }
   elsif ($type == $Mail::SpamAssassin::Conf::TYPE_HEAD_TESTS)
   {
@@ -1379,6 +1379,7 @@ sub add_test {
       if ($pat =~ s/\s+\[if-unset:\s+(.+)\]$//) {
         $conf->{test_opt_unset}->{$name} = $1;
       }
+      $self->parse_captures($name, \$pat);
       my ($rec, $err) = compile_regexp($pat, 1, $ignore_amre);
       if (!$rec) {
         $self->lint_warn("config: invalid regexp for $name '$pat': $err", $name);
@@ -1387,7 +1388,6 @@ sub add_test {
       $conf->{test_qrs}->{$name} = $rec;
       $conf->{test_opt_header}->{$name} = $hdr;
       $conf->{test_opt_neg}->{$name} = 1 if $op eq '!~';
-      $self->parse_captures($name, $rec);
     }
   }
   elsif ($type == $Mail::SpamAssassin::Conf::TYPE_META_TESTS)
@@ -1516,15 +1516,16 @@ sub parse_captures {
   my ($self, $name, $re) = @_;
 
   # Check for named regex capture templates
-  if (index($re, '%{') >= 0) {
+  if (index($$re, '%{') >= 0) {
     local($1);
-    while ($re =~ /(?<!\\)\%\{([A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*(?:\([^\)\}]*\))?)\}/g) {
+    # Replace %{FOO} with %\{FOO\} so compile_regexp doesn't fail with unescaped left brace
+    while ($$re =~ s/(?<!\\)\%\{([A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*(?:\([^\)\}]*\))?)\}/%\\{$1\\}/g) {
       dbg("config: found named capture for rule $name: $1");
       $self->{conf}->{capture_template_rules}->{$name}->{$1} = 1;
     }
   }
   # Make rules with captures run before anything else
-  if ($re =~ /\(\?P?[<'][A-Z]/) {
+  if ($$re =~ /\(\?P?[<'][A-Z]/) {
     dbg("config: adjusting regex capture rule $name priority to -10000");
     $self->{conf}->{priority}->{$name} = -10000;
     $self->{conf}->{capture_rules}->{$name} = 1;

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/Check.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/Check.pm?rev=1901347&r1=1901346&r2=1901347&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/Check.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/Check.pm Sat May 28 11:00:42 2022
@@ -1413,7 +1413,7 @@ sub capture_rules_replace {
         my @vals = grep { defined $_ && $_ ne "" } (ref $valref ? @$valref : $valref);
         if (@vals) {
           my $cval = "(?:".join("|", map { quotemeta($_) } @vals).")";
-          $test_qr =~ s/(?<!\\\\)\\%\\{\Q${cname}\E\\}/$cval/gs;
+          $test_qr =~ s/(?<!\\\\)\\%\\\\{\Q${cname}\E\\\\}/$cval/gs;
   ';
   if ($would_log_rules_all) {
     $code .= '