Fix NOERR/NXDOMAIN in answers configured by --domain-needed.

This commit is contained in:
Simon Kelley
2021-08-08 21:28:29 +01:00
parent 8389b943d3
commit 867e56a45e

View File

@@ -255,29 +255,25 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr,
/* new query */ /* new query */
if (!forward) if (!forward)
{ {
/* new query */ if (lookup_domain(daemon->namebuff, gotname, &first, &last))
flags = is_local_answer(now, first, daemon->namebuff);
else
{
/* no available server. */
ede = EDE_NOT_READY;
flags = 0;
}
/* don't forward A or AAAA queries for simple names, except the empty name */ /* don't forward A or AAAA queries for simple names, except the empty name */
if (option_bool(OPT_NODOTS_LOCAL) && if (!flags &&
option_bool(OPT_NODOTS_LOCAL) &&
(gotname & (F_IPV4 | F_IPV6)) && (gotname & (F_IPV4 | F_IPV6)) &&
!strchr(daemon->namebuff, '.') && !strchr(daemon->namebuff, '.') &&
strlen(daemon->namebuff) != 0) strlen(daemon->namebuff) != 0)
{ flags = check_for_local_domain(daemon->namebuff, now) ? F_NOERR : F_NXDOMAIN;
flags = F_NOERR;
goto reply;
}
flags = 0;
/* no available server. */
if (!lookup_domain(daemon->namebuff, gotname, &first, &last))
{
ede = EDE_NOT_READY;
goto reply;
}
/* Configured answer. */ /* Configured answer. */
if ((flags = is_local_answer(now, first, daemon->namebuff))) if (flags || ede == EDE_NOT_READY)
goto reply; goto reply;
master = daemon->serverarray[first]; master = daemon->serverarray[first];
@@ -2037,16 +2033,25 @@ unsigned char *tcp_request(int confd, time_t now,
{ {
struct server *master; struct server *master;
int start; int start;
if (lookup_domain(daemon->namebuff, gotname, &first, &last))
flags = is_local_answer(now, first, daemon->namebuff);
else
{
/* No configured servers */
ede = EDE_NOT_READY;
flags = 0;
}
/* don't forward A or AAAA queries for simple names, except the empty name */ /* don't forward A or AAAA queries for simple names, except the empty name */
if (option_bool(OPT_NODOTS_LOCAL) && if (!flags &&
option_bool(OPT_NODOTS_LOCAL) &&
(gotname & (F_IPV4 | F_IPV6)) && (gotname & (F_IPV4 | F_IPV6)) &&
!strchr(daemon->namebuff, '.') && !strchr(daemon->namebuff, '.') &&
strlen(daemon->namebuff) != 0) strlen(daemon->namebuff) != 0)
flags = F_NOERR; flags = check_for_local_domain(daemon->namebuff, now) ? F_NOERR : F_NXDOMAIN;
else if (!lookup_domain(daemon->namebuff, gotname, &first, &last))
ede = EDE_NOT_READY; /* No configured servers */ if (!flags && ede != EDE_NOT_READY)
else if (!(flags = is_local_answer(now, first, daemon->namebuff)))
{ {
master = daemon->serverarray[first]; master = daemon->serverarray[first];
@@ -2093,10 +2098,10 @@ unsigned char *tcp_request(int confd, time_t now,
int status = tcp_key_recurse(now, STAT_OK, header, m, 0, daemon->namebuff, daemon->keyname, int status = tcp_key_recurse(now, STAT_OK, header, m, 0, daemon->namebuff, daemon->keyname,
serv, have_mark, mark, &keycount); serv, have_mark, mark, &keycount);
char *result, *domain = "result"; char *result, *domain = "result";
union all_addr a; union all_addr a;
a.log.ede = ede = errflags_to_ede(status); a.log.ede = ede = errflags_to_ede(status);
if (STAT_ISEQUAL(status, STAT_ABANDONED)) if (STAT_ISEQUAL(status, STAT_ABANDONED))
{ {
result = "ABANDONED"; result = "ABANDONED";
@@ -2137,7 +2142,7 @@ unsigned char *tcp_request(int confd, time_t now,
} }
} }
} }
/* In case of local answer or no connections made. */ /* In case of local answer or no connections made. */
if (m == 0) if (m == 0)
{ {