| 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; |