Skip to content

Commit 1a1306d

Browse files
sig11bcorecode
authored andcommitted
dns: do not treat unreachable DNS server as permanent error
getaddrinfo() does not distinguish between "DNS server not reachable" and "DNS server told me host does not exist". For SMARTHOSTS it is better to defer than to bounce in order to survive network outages. Bug: fixes #30
1 parent c33f12b commit 1a1306d

File tree

1 file changed

+20
-4
lines changed

1 file changed

+20
-4
lines changed

dns.c

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,17 +68,33 @@ add_host(int pref, const char *host, int port, struct mx_hostentry **he, size_t
6868
char servname[10];
6969
struct mx_hostentry *p;
7070
const int count_inc = 10;
71-
int err;
7271

7372
memset(&hints, 0, sizeof(hints));
7473
hints.ai_family = PF_UNSPEC;
7574
hints.ai_socktype = SOCK_STREAM;
7675
hints.ai_protocol = IPPROTO_TCP;
7776

7877
snprintf(servname, sizeof(servname), "%d", port);
79-
err = getaddrinfo(host, servname, &hints, &res0);
80-
if (err)
81-
return (err == EAI_AGAIN ? 1 : -1);
78+
switch (getaddrinfo(host, servname, &hints, &res0)) {
79+
case 0:
80+
break;
81+
case EAI_AGAIN:
82+
case EAI_NONAME:
83+
/*
84+
* EAI_NONAME gets returned for:
85+
* SMARTHOST set but DNS server not reachable -> defer
86+
* SMARTHOST set but DNS server returns "host does not exist"
87+
* -> buggy configuration
88+
* -> either defer or bounce would be ok -> defer
89+
* MX entry was returned by DNS server but name doesn't resolve
90+
* -> hopefully transient situation -> defer
91+
* all other DNS problems should have been caught earlier
92+
* in dns_get_mx_list().
93+
*/
94+
goto out;
95+
default:
96+
return(-1);
97+
}
8298

8399
for (res = res0; res != NULL; res = res->ai_next) {
84100
if (*ps + 1 >= roundup(*ps, count_inc)) {

0 commit comments

Comments
 (0)