1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
Description: Disable AI_ADDRCONFIG when passing IPv4 literals to getaddrinfo
AI_ADDRCONFIG skips the loopback interface, but if it's the only one with IPv4
addresses configured, then it won't be returned by getaddrinfo and spamd won't
end up listening anywhere.
.
Forwarded: no
Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1027925
Index: spamassassin/spamd/spamd.raw
===================================================================
--- spamassassin.orig/spamd/spamd.raw
+++ spamassassin/spamd/spamd.raw
@@ -53,7 +53,7 @@ BEGIN {
}
our ($have_getaddrinfo_in_core, $have_getaddrinfo_legacy, $io_socket_module_name,
- $have_inet4, $have_inet6, $ai_addrconfig_flag);
+ $have_inet4, $have_inet6, $getaddrinfo_flags);
# don't force requirement on IO::Socket::IP or IO::Socket::INET6
BEGIN {
@@ -91,7 +91,7 @@ BEGIN {
&AF_UNSPEC; &AF_INET; &AF_INET6; # enable inlining
- $ai_addrconfig_flag = 0;
+ $getaddrinfo_flags = 0;
if ($have_getaddrinfo_in_core) {
# using a modern Socket module
@@ -100,16 +100,20 @@ BEGIN {
if (&AI_ADDRCONFIG && &EAI_BADFLAGS) {
my($err, @res) = Socket::getaddrinfo("localhost", 0,
{ family => &AF_UNSPEC, flags => &AI_ADDRCONFIG });
- $ai_addrconfig_flag = &AI_ADDRCONFIG if !$err || $err != &EAI_BADFLAGS;
+ $getaddrinfo_flags |= &AI_ADDRCONFIG if !$err || $err != &EAI_BADFLAGS;
}
};
*ip_or_name_to_ip_addresses = sub {
my($addr, $ai_family) = @_;
+ if($addr =~ /^\d+\.\d+\.\d+\.\d+$/) {
+ $getaddrinfo_flags ^= &AI_ADDRCONFIG;
+ $getaddrinfo_flags |= &AI_NUMERICHOST;
+ }
# Socket::getaddrinfo returns a list of hashrefs
my($error, @res) =
Socket::getaddrinfo($addr, 0,
- { family => $ai_family, flags => $ai_addrconfig_flag | &AI_PASSIVE,
+ { family => $ai_family, flags => $getaddrinfo_flags | &AI_PASSIVE,
socktype => &SOCK_STREAM, protocol => &IPPROTO_TCP });
my(@ip_addrs);
if (!$error) {
@@ -149,16 +153,20 @@ BEGIN {
my @res = Socket6::getaddrinfo("localhost", "", 0, &SOCK_STREAM,
&IPPROTO_TCP, &AI_ADDRCONFIG);
my $err = @res >= 5 ? 0 : $res[0];
- $ai_addrconfig_flag = &AI_ADDRCONFIG if !$err || $err != &EAI_BADFLAGS;
+ $getaddrinfo_flags = &AI_ADDRCONFIG if !$err || $err != &EAI_BADFLAGS;
}
};
*ip_or_name_to_ip_addresses = sub {
my($addr, $ai_family) = @_;
+ if($addr =~ /^\d+\.\d+\.\d+\.\d+$/) {
+ $getaddrinfo_flags ^= &AI_ADDRCONFIG;
+ }
# Socket6::getaddrinfo returns a list of quintuples
+ dbg("Calling Socket6::getaddrinfo with family $ai_family and addr $addr");
my @res = Socket6::getaddrinfo($addr, '',
$ai_family, &SOCK_STREAM, &IPPROTO_TCP,
- $ai_addrconfig_flag | &AI_PASSIVE);
+ $getaddrinfo_flags | &AI_PASSIVE);
my($error, @ip_addrs);
if (@res < 5) {
$error = $res[0];
@@ -792,7 +800,7 @@ dbg("spamd: socket module of choice: %s
$have_getaddrinfo_in_core ? 'using Socket::getaddrinfo'
: $have_getaddrinfo_legacy ? 'using legacy Socket6::getaddrinfo'
: 'no getaddrinfo, using gethostbyname, IPv4-only',
- $ai_addrconfig_flag ? "is supported" : "not supported",
+ $getaddrinfo_flags & &AI_ADDRCONFIG ? "is supported" : "not supported",
);
my $have_ssl_module;
|