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/10/24 07:59:32 UTC

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

Author: hege
Date: Mon Oct 24 07:59:32 2022
New Revision: 1904797

URL: http://svn.apache.org/viewvc?rev=1904797&view=rev
Log:
Bug 8061 - Fix meta handling for $suppl_attrib->{rule_hits}

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=1904797&r1=1904796&r2=1904797&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm Mon Oct 24 07:59:32 2022
@@ -1140,7 +1140,14 @@ sub compile_meta_rules {
       $conf->{meta_tests}->{$name} = sub { 0 };
       $rule_deps{$name} = [ ];
     }
-    if (@{$rule_deps{$name}}) {
+    if ($meta{$name} eq '( ) ') {
+      # Bug 8061:
+      # meta FOOBAR () considered a rule declaration to support rule_hits API or
+      #  other dynamic rules, only evaluated at finish_meta_rules unless got_hit.
+      # Other style metas without dependencies will be evaluated immediately.
+      $meta{$name} = '0'; # Evaluating () would result in undef
+    }
+    elsif (@{$rule_deps{$name}}) {
       $conf->{meta_dependencies}->{$name} = $rule_deps{$name};
       foreach my $deprule (@{$rule_deps{$name}}) {
         $conf->{meta_deprules}->{$deprule}->{$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=1904797&r1=1904796&r2=1904797&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/Check.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/Check.pm Mon Oct 24 07:59:32 2022
@@ -58,6 +58,18 @@ sub check_main {
   # Make AsyncLoop wait launch_queue() for launching queries
   $pms->{async}->start_queue();
 
+  # initialize meta stuff
+  $pms->{meta_pending} = {};
+  foreach my $rulename (keys %{$conf->{meta_tests}}) {
+    $pms->{meta_pending}->{$rulename} = 1  if $conf->{scores}->{$rulename};
+  }
+  # metas without dependencies are ready to be run
+  foreach my $rulename (keys %{$conf->{meta_nodeps}}) {
+  dbg("check: meta_check_ready $rulename");
+    $pms->{meta_check_ready}->{$rulename} = 1;
+  }
+
+  # rule_hits API implemented in 3.3.0
   my $suppl_attrib = $pms->{msg}->{suppl_attrib};
   if (ref $suppl_attrib && ref $suppl_attrib->{rule_hits}) {
     my @caller_rule_hits = @{$suppl_attrib->{rule_hits}};
@@ -68,6 +80,8 @@ sub check_main {
          $ruletype, $tflags, $description) =
         @$caller_rule_hit{qw(rule area score defscore value
                              ruletype tflags descr)};
+      dbg("rules: ran rule_hits rule $rulename ======> got hit (%s)",
+          defined $value ? $value : '1');
       $pms->got_hit($rulename, $area,
                     !defined $score ? () : (score => $score),
                     !defined $defscore ? () : (defscore => $defscore),
@@ -75,6 +89,8 @@ sub check_main {
                     !defined $tflags ? () : (tflags => $tflags),
                     !defined $description ? () : (description => $description),
                     ruletype => $ruletype);
+      delete $pms->{meta_pending}->{$rulename};
+      delete $pms->{meta_check_ready}->{$rulename};
     }
   }
 
@@ -94,16 +110,6 @@ sub check_main {
   dbg("check: check_main, time limit in %.3f s",
       $master_deadline - time)  if $master_deadline;
 
-  # initialize meta stuff
-  $pms->{meta_pending} = {};
-  foreach my $rulename (keys %{$conf->{meta_tests}}) {
-    $pms->{meta_pending}->{$rulename} = 1  if $conf->{scores}->{$rulename};
-  }
-  # metas without dependencies are ready to be run
-  foreach my $rulename (keys %{$conf->{meta_nodeps}}) {
-    $pms->{meta_check_ready}->{$rulename} = 1;
-  }
-
   # Make sure priority -100 exists for launching DNS
   $conf->{priorities}->{-100} ||= 1 if $do_dns;
 
@@ -214,6 +220,7 @@ sub check_main {
   $self->{main}->call_plugins ("check_cleanup", { permsgstatus => $pms });
 
   # final check for ready metas
+  $self->do_meta_tests($pms);
   $self->finish_meta_tests($pms);
 
   # check dns_block_rule (bug 6728)
@@ -277,7 +284,7 @@ sub do_meta_tests {
   my ($self, $pms, $priority) = @_;
 
   # Needed for Reuse to work, otherwise we don't care about priorities
-  if ($self->{main}->have_plugin('start_rules')) {
+  if (defined $priority && $self->{main}->have_plugin('start_rules')) {
     $self->{main}->call_plugins('start_rules', {
       permsgstatus => $pms,
       ruletype => 'meta',
@@ -304,7 +311,7 @@ RULE:
       }
     }
     # Metasubs look like ($_[1]->{$rulename}||($_[2]->{$rulename}?1:0)) ...
-    my $result = $mt->{$rulename}->($pms, $h, {});
+    my $result = $mt->{$rulename}->($pms, $h, {}) ? 1 : 0;
     if ($result) {
       dbg("rules: ran meta rule $rulename ======> got hit ($result)");
       $pms->got_hit($rulename, '', ruletype => 'meta', value => $result);
@@ -346,11 +353,11 @@ RULE:
       }
     }
     # Metasubs look like ($_[1]->{$rulename}||($_[2]->{$rulename}?1:0)) ...
-    my $result = $mt->{$rulename}->($pms, $h, {});
+    my $result = $mt->{$rulename}->($pms, $h, {}) ? 1 : 0;
     my $result2 = $result;
     if (%unrun) {
       # Evaluate all unrun rules as true using %unrun list
-      $result2 = $mt->{$rulename}->($pms, $h, \%unrun);
+      $result2 = $mt->{$rulename}->($pms, $h, \%unrun) ? 1 : 0;
     }
     # Evaluated second time with all unrun rules as true.  If result is not
     # the same, we can't safely finish the meta. (Bug 7735)
@@ -373,6 +380,7 @@ RULE:
   if ($would_log_rules_all) {
     foreach my $rulename (sort keys %{$pms->{conf}->{meta_tests}}) {
       next if !$pms->{conf}->{scores}->{$rulename};
+      next if exists $h->{$rulename};
       my %unrun;
       foreach my $deprule (@{$md->{$rulename}||[]}) {
         $unrun{$deprule} = 1  if !exists $h->{$deprule};