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 2019/08/06 06:44:42 UTC

svn commit: r1864461 - /spamassassin/branches/3.4/lib/Mail/SpamAssassin/Plugin/FreeMail.pm

Author: hege
Date: Tue Aug  6 06:44:42 2019
New Revision: 1864461

URL: http://svn.apache.org/viewvc?rev=1864461&view=rev
Log:
Sync FreeMail from trunk

Modified:
    spamassassin/branches/3.4/lib/Mail/SpamAssassin/Plugin/FreeMail.pm

Modified: spamassassin/branches/3.4/lib/Mail/SpamAssassin/Plugin/FreeMail.pm
URL: http://svn.apache.org/viewvc/spamassassin/branches/3.4/lib/Mail/SpamAssassin/Plugin/FreeMail.pm?rev=1864461&r1=1864460&r2=1864461&view=diff
==============================================================================
--- spamassassin/branches/3.4/lib/Mail/SpamAssassin/Plugin/FreeMail.pm (original)
+++ spamassassin/branches/3.4/lib/Mail/SpamAssassin/Plugin/FreeMail.pm Tue Aug  6 06:44:42 2019
@@ -18,6 +18,8 @@
 package Mail::SpamAssassin::Plugin::FreeMail;
 use strict;
 use warnings;
+use re 'taint';
+
 my $VERSION = 2.003;
 
 =head1 NAME
@@ -109,6 +111,7 @@ header FREEMAIL_BODY eval:check_freemail
 
 use Mail::SpamAssassin::Plugin;
 use Mail::SpamAssassin::PerMsgStatus;
+use Mail::SpamAssassin::Util qw(compile_regexp);
 
 our @ISA = qw(Mail::SpamAssassin::Plugin);
 
@@ -333,7 +336,7 @@ sub _is_freemail {
     foreach my $list ('whitelist_auth','def_whitelist_auth') {
         if ($pms->{conf}->{"freemail_import_$list"}) {
             foreach my $regexp (values %{$pms->{conf}->{$list}}) {
-                if ($email =~ /$regexp/) {
+                if ($email =~ /$regexp/o) {
                     dbg("whitelisted email, $list: $email");
                     return 0;
                 }
@@ -362,7 +365,7 @@ sub _parse_body {
         my $parsed = $pms->get_uri_detail_list();
         while (my($uri, $info) = each %{$parsed}) {
             if (defined $info->{types}->{a} and not defined $info->{types}->{parsed}) {
-                if ($uri =~ /^(?:(?i)mailto):$self->{email_regex}/) {
+                if ($uri =~ /^(?:(?i)mailto):$self->{email_regex}/o) {
                     my $email = lc($1);
                     push(@body_emails, $email) unless defined $seen{$email};
                     $seen{$email} = 1;
@@ -451,11 +454,12 @@ sub check_freemail_header {
 
     my $re;
     if (defined $regex) {
-        $re = eval { qr/$regex/; };
-        if ($@) {
-            warn("invalid regex: $@");
+        my ($rec, $err) = compile_regexp($regex, 0);
+        if (!$rec) {
+            warn "freemail: invalid regexp for $rulename '$regex': $err\n";
             return 0;
         }
+        $re = $rec;
     }
 
     my @emails = map (lc, $pms->{main}->find_all_addrs_in_line ($pms->get($header)));
@@ -469,7 +473,7 @@ sub check_freemail_header {
     foreach my $email (@emails) {    
         if ($self->_is_freemail($email, $pms)) {
             if (defined $re) {
-                next unless $email =~ $re;
+                next unless $email =~ /$re/o;
                 dbg("HIT! $email is freemail and matches regex");
             }
             else {
@@ -495,16 +499,17 @@ sub check_freemail_body {
 
     my $re;
     if (defined $regex) {
-        $re = eval { qr/$regex/; };
-        if ($@) {
-            warn("invalid regex: $@");
+        my ($rec, $err) = compile_regexp($regex, 0);
+        if (!$rec) {
+            warn "freemail: invalid regexp for $rulename '$regex': $err\n";
             return 0;
         }
+        $re = $rec;
     }
 
     if (defined $re) {
         foreach my $email (keys %{$pms->{freemail_cache}{body}}) {
-            if ($email =~ $re) {
+            if ($email =~ /$re/o) {
                 dbg("HIT! email from body is freemail and matches regex: $email");
                 $self->_got_hit($pms, $email, "Email from body is freemail");
                 return 0;
@@ -531,11 +536,12 @@ sub check_freemail_from {
 
     my $re;
     if (defined $regex) {
-        $re = eval { qr/$regex/; };
-        if ($@ or not defined $re) {
-            warn("invalid regex: $@");
+        my ($rec, $err) = compile_regexp($regex, 0);
+        if (!$rec) {
+            warn "freemail: invalid regexp for $rulename '$regex': $err\n";
             return 0;
         }
+        $re = $rec;
     }
 
     my %from_addrs = map { lc($_) => 1 } ($pms->all_from_addrs());
@@ -551,7 +557,7 @@ sub check_freemail_from {
     foreach my $email (keys %from_addrs) {
         next unless $self->_is_freemail($email, $pms);
         if (defined $re) {
-            next unless $email =~ $re;
+            next unless $email =~ /$re/o;
             dbg("HIT! $email is freemail and matches regex");
         }
         else {