Mailing List Archive

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 .= '