From the perldoc DESCRIPTION section of DnsResolver.pm, it says :" This is a DNS resolution engine for SpamAssassin, implemented in order to reduce file descriptor usage by Net::DNS and avoid a response collision bug in that module.", what this description really refered to is bugs:
http://issues.apache.org/SpamAssassin/s ... gi?id=3997
http://issues.apache.org/SpamAssassin/s ... gi?id=4260
bug 3997 is really a long discussion, comment #73 finally sort out what the cause is
------quote-----
"....The problem is that there is nothing in the RFCs to prevent reuse of a UDP
source port once there is no active listener on that port. UDP connections are
not persistent, so there is nothing that IO::Socket can do to ensure that a
reply to a UDP port is not a response to some old packet that was sent from that
port.
This is a known problem in the DNS world, with a solution built in to the DNS
protocol. The DNS query packet has a header with an identifier field, which is
an arbitrary 16 bit number set by the sender. The nameserver copies it to the
identifier field of the header of the response packet. see http://www.tcpipguide.com/free/t_DNSMes ... #Table_169
This is above the IO::Socket layer, so the fix can't be there. Net::DNS can't
use the ID field to ensure that a bgread matches up with a bgsend unless it
cached every socket returned by bgsend in order to save the ID in a hash with
it. I don't think that is practical.
That leaves SpamAssassin as the right level for the fix.
---------quote-------------
http://issues.apache.org/SpamAssassin/s ... gi?id=3997
http://issues.apache.org/SpamAssassin/s ... gi?id=4260
bug 3997 is really a long discussion, comment #73 finally sort out what the cause is
------quote-----
"....The problem is that there is nothing in the RFCs to prevent reuse of a UDP
source port once there is no active listener on that port. UDP connections are
not persistent, so there is nothing that IO::Socket can do to ensure that a
reply to a UDP port is not a response to some old packet that was sent from that
port.
This is a known problem in the DNS world, with a solution built in to the DNS
protocol. The DNS query packet has a header with an identifier field, which is
an arbitrary 16 bit number set by the sender. The nameserver copies it to the
identifier field of the header of the response packet. see http://www.tcpipguide.com/free/t_DNSMes ... #Table_169
This is above the IO::Socket layer, so the fix can't be there. Net::DNS can't
use the ID field to ensure that a bgread matches up with a bgsend unless it
cached every socket returned by bgsend in order to save the ID in a hash with
it. I don't think that is practical.
That leaves SpamAssassin as the right level for the fix.
---------quote-------------