BUG/MINOR: resolvers: default resolvers fails when network not configured

Bug #1740 was opened again, this time a user is complaining about the
"can't create socket for nameserver". This can happen if the resolv.conf
file contains a class of address which was not configured on the
machine, for example IPv6.

The fix does the same as b10b1196b ("MINOR: resolvers: shut the warning
when "default" resolvers is implicit"), and uses the
"resolvers->conf.implicit" variable to emit the error.

Though it is not needed to convert the explicit behavior with a
ERR_WARN, because this is supposed to be an unrecoverable error, unlike
the connect().

Should fix issue #1740.

Must be backported were b10b1196b was backported. (as far as 2.6)
This commit is contained in:
William Lallemand 2023-12-18 12:35:35 +01:00
parent c5bde03a0a
commit 0d2ebb53f7
1 changed files with 5 additions and 3 deletions

View File

@ -2567,9 +2567,11 @@ static int resolvers_finalize_config(void)
if (ns->dgram) { if (ns->dgram) {
/* Check nameserver info */ /* Check nameserver info */
if ((fd = socket(ns->dgram->conn.addr.to.ss_family, SOCK_DGRAM, IPPROTO_UDP)) == -1) { if ((fd = socket(ns->dgram->conn.addr.to.ss_family, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
if (!resolvers->conf.implicit) { /* emit a warning only if it was configured manually */
ha_alert("resolvers '%s': can't create socket for nameserver '%s'.\n", ha_alert("resolvers '%s': can't create socket for nameserver '%s'.\n",
resolvers->id, ns->id); resolvers->id, ns->id);
err_code |= (ERR_ALERT|ERR_ABORT); err_code |= (ERR_ALERT|ERR_ABORT);
}
continue; continue;
} }
if (connect(fd, (struct sockaddr*)&ns->dgram->conn.addr.to, get_addr_len(&ns->dgram->conn.addr.to)) == -1) { if (connect(fd, (struct sockaddr*)&ns->dgram->conn.addr.to, get_addr_len(&ns->dgram->conn.addr.to)) == -1) {