https://issues.apache.org/SpamAssassin/show_bug.cgi?id=7057
Bug ID: 7057
Summary: Net::DNS 0.76 compatibility: available_nameservers: No
DNS servers available!
Product: Spamassassin
Version: 3.4.0
Hardware: All
OS: All
Status: NEW
Severity: critical
Priority: P2
Component: Libraries
Assignee: [email protected]
Reporter: [email protected]
Net::DNS version 0.76 changed the field name holding a set of nameservers
in a Net::DNS::Resolver object: it used to be 'nameservers',
but is now split into two fields: 'nameserver4' and 'nameserver6'.
Mail/SpamAssassin/DnsResolver.pm relied on the internal field name
of a Net::DNS::Resolver object to obtain a default list of
recursive name servers, so the change in Net::DNS broke that.
As a result, SpamAssassin now fails DNS checks and reports:
dns: eval failed: available_nameservers: No DNS servers available!
when used with Net::DNS 0.76 or later and no DNS servers are
configured explicitly in a custom .cf file (config option: dns_server).
The problem was reported by Walter Hurry on a mailing list, 2014-06-17.
The solution is to use an official access method to obtain this
information from Net::DNS::Resolver. Apparently early versions
of Net::DNS lacked such official access method, which is why we
needed to peek under the Net::DNS hood.
Proposed patch:
--- Mail/SpamAssassin/DnsResolver.pm.orig 2014-05-07 17:54:29 +0200
+++ Mail/SpamAssassin/DnsResolver.pm 2014-06-18 02:13:32 +0200
@@ -205,6 +205,8 @@
dbg("dns: servers set by config to: %s", join(', ',@ns_addr_port));
} elsif ($res) { # default as provided by Net::DNS, e.g. /etc/resolv.conf
- @ns_addr_port = map(untaint_var("[$_]:" . $res->{port}),
- @{$res->{nameservers}});
+ my @ns = $res->UNIVERSAL::can('nameservers') ? $res->nameservers
+ : @{$res->{nameservers}};
+ my $port = $res->UNIVERSAL::can('port') ? $res->port : $res->{port};
+ @ns_addr_port = map(untaint_var("[$_]:" . $port), @ns);
dbg("dns: servers obtained from Net::DNS : %s", join(', ',@ns_addr_port));
}
--
You are receiving this mail because:
You are the assignee for the bug.