You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by mm...@apache.org on 2013/01/12 03:28:14 UTC

svn commit: r1432359 - in /spamassassin/trunk/lib/Mail/SpamAssassin: Dns.pm DnsResolver.pm Plugin/ASN.pm Plugin/AskDNS.pm Plugin/URIDNSBL.pm

Author: mmartinec
Date: Sat Jan 12 02:28:13 2013
New Revision: 1432359

URL: http://svn.apache.org/viewvc?rev=1432359&view=rev
Log:
DnsResolver: prevent a failed or suppressed DNS query packet generation from propagating unnecessarily

Modified:
    spamassassin/trunk/lib/Mail/SpamAssassin/Dns.pm
    spamassassin/trunk/lib/Mail/SpamAssassin/DnsResolver.pm
    spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/ASN.pm
    spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/AskDNS.pm
    spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/URIDNSBL.pm

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Dns.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Dns.pm?rev=1432359&r1=1432358&r2=1432359&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Dns.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Dns.pm Sat Jan 12 02:28:13 2013
@@ -106,7 +106,6 @@ sub do_rbl_lookup {
 
   # only make a specific query once
   if (!$existing) {
-    dbg("dns: launching DNS $type query for $host in background");
 
     my $ent = {
       key => $key,
@@ -123,23 +122,29 @@ sub do_rbl_lookup {
         $self->{async}->report_id_complete($id,$key,$timestamp);
       });
 
-    $ent->{id} = $id;     # tie up the loose end
-    $existing =
-      $self->{async}->start_lookup($ent, $self->{master_deadline});
+    if (!defined $id) {
+      dbg("dns: SKIPPED launching of DNS $type query for $host");
+    } else {
+      dbg("dns: launched DNS $type query for $host in background");
+      $ent->{id} = $id;     # tie up the loose end
+      $existing =
+        $self->{async}->start_lookup($ent, $self->{master_deadline});
+    }
   }
 
-  # always add set
-  push @{$existing->{sets}}, $set;
+  if ($existing) {
+    # always add set
+    push @{$existing->{sets}}, $set;
 
-  # sometimes match or always match
-  if (defined $subtest) {
-    $self->{dnspost}->{$set}->{$subtest} = $rule;
-  }
-  else {
-    push @{$existing->{rules}}, $rule;
-  }
+    # sometimes match or always match
+    if (defined $subtest) {
+      $self->{dnspost}->{$set}->{$subtest} = $rule;
+    } else {
+      push @{$existing->{rules}}, $rule;
+    }
 
-  $self->{rule_to_rblkey}->{$rule} = $key;
+    $self->{rule_to_rblkey}->{$rule} = $key;
+  }
 }
 
 # TODO: these are constant so they should only be added once at startup
@@ -156,8 +161,6 @@ sub do_dns_lookup {
   # only make a specific query once
   return if $self->{async}->get_lookup($key);
 
-  dbg("dns: launching DNS $type query for $host in background");
-
   my $ent = {
     key => $key,
     zone => $host,  # serves to fetch other per-zone settings
@@ -172,8 +175,13 @@ sub do_dns_lookup {
       $self->{async}->report_id_complete($id,$key,$timestamp);
     });
 
-  $ent->{id} = $id;     # tie up the loose end
-  $self->{async}->start_lookup($ent, $self->{master_deadline});
+  if (!defined $id) {
+    dbg("dns: SKIPPED launching of DNS $type query for $host");
+  } else {
+    dbg("dns: launched DNS $type query for $host in background");
+    $ent->{id} = $id;     # tie up the loose end
+    $self->{async}->start_lookup($ent, $self->{master_deadline});
+  }
 }
 
 ###########################################################################

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/DnsResolver.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/DnsResolver.pm?rev=1432359&r1=1432358&r2=1432359&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/DnsResolver.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/DnsResolver.pm Sat Jan 12 02:28:13 2013
@@ -804,11 +804,13 @@ sub send {
 
     $timeout = 1 if ($timeout < 1);
     # note nifty use of a closure here.  I love closures ;)
-    $self->bgsend($name, $type, $class, sub {
+    my $id = $self->bgsend($name, $type, $class, sub {
       my ($reply, $reply_id, $timestamp) = @_;
       $answerpkt = $reply; $answerpkt_avail = 1;
     });
 
+    last if !defined $id;  # perhaps a restricted zone or a serious failure
+
     my $now = time;
     my $deadline = $now + $timeout;
 

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/ASN.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/ASN.pm?rev=1432359&r1=1432358&r2=1432359&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/ASN.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/ASN.pm Sat Jan 12 02:28:13 2013
@@ -299,15 +299,19 @@ sub parsed_metadata {
       $pms->{async}->set_response_packet($id, $pkt, $key, $timestamp);
       $self->process_dns_result($pms, $pkt, $zone_index);
     });
-    my $ent = {
-      key=>$key, id=>$id, type=>'TXT',
-      zone => $zone,  # serves to fetch other per-zone settings
-    };
-    $pms->{async}->start_lookup($ent, $pms->{master_deadline});
-    dbg("asn: launched DNS TXT query for %s.%s in background",
-        $reversed_ip, $entry->{zone});
-
-    $index++;
+    if (!defined $id) {
+      dbg("asn: SKIPPED launching of DNS TXT query for %s.%s",
+          $reversed_ip, $entry->{zone});
+    } else {
+      my $ent = {
+        key=>$key, id=>$id, type=>'TXT',
+        zone => $zone,  # serves to fetch other per-zone settings
+      };
+      $pms->{async}->start_lookup($ent, $pms->{master_deadline});
+      dbg("asn: launched DNS TXT query for %s.%s in background",
+          $reversed_ip, $entry->{zone});
+      $index++;
+    }
   }
 }
 

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/AskDNS.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/AskDNS.pm?rev=1432359&r1=1432358&r2=1432359&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/AskDNS.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/AskDNS.pm Sat Jan 12 02:28:13 2013
@@ -644,6 +644,7 @@ sub askdns_hit {
 sub start_lookup {
   my($self, $pms, $query_type, $query_domain, $id, $dnskey) = @_;
 
+  return if !defined $id;
   my $ent = {
     key => $dnskey,
     domain => $query_domain,  # used for logging and reporting

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/URIDNSBL.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/URIDNSBL.pm?rev=1432359&r1=1432358&r2=1432359&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/URIDNSBL.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/URIDNSBL.pm Sat Jan 12 02:28:13 2013
@@ -913,7 +913,7 @@ sub lookup_domain_ns {
   my $ent = $self->start_lookup($scanner, $dom, 'NS',
                                 $self->res_bgsend($scanner, $dom, 'NS', $key),
                                 $key);
-  $ent->{obj} = $obj;
+  $ent->{obj} = $obj  if $ent;
 }
 
 sub complete_ns_lookup {
@@ -989,7 +989,7 @@ sub lookup_a_record {
   my $ent = $self->start_lookup($scanner, $hname, 'A',
                                 $self->res_bgsend($scanner, $hname, 'A', $key),
                                 $key);
-  $ent->{obj} = $obj;
+  $ent->{obj} = $obj  if $ent;
 }
 
 sub complete_a_lookup {
@@ -1054,9 +1054,11 @@ sub lookup_single_dnsbl {
   my $ent = $self->start_lookup($scanner, $item, 'DNSBL',
                             $self->res_bgsend($scanner, $item, $qtype, $key),
                             $key);
-  $ent->{obj} = $obj;
-  $ent->{rulename} = $rulename;
-  $ent->{zone} = $dnsbl;
+  if ($ent) {
+    $ent->{obj} = $obj;
+    $ent->{rulename} = $rulename;
+    $ent->{zone} = $dnsbl;
+  }
 }
 
 sub complete_dnsbl_lookup {
@@ -1178,6 +1180,7 @@ sub got_dnsbl_hit {
 sub start_lookup {
   my ($self, $scanner, $zone, $type, $id, $key) = @_;
 
+  return if !defined $id;
   my $ent = {
     key => $key,
     zone => $zone,  # serves to fetch other per-zone settings