Package: spamassassin / 4.0.1+svn1923525-1

spamd_disable_ai_addrconfig_for_ipv4_literals.patch Patch series | download
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;