Tweak logging and special handling of T_ANY in rr-filter code.

This commit is contained in:
Simon Kelley
2024-02-12 13:42:07 +00:00
parent 762a3f2430
commit febeea9d01
2 changed files with 20 additions and 26 deletions

View File

@@ -593,7 +593,7 @@ static int find_soa(struct dns_header *header, size_t qlen, char *name, int *sub
} }
/* Print TXT reply to log */ /* Print TXT reply to log */
static int log_txt(char *name, unsigned char *p, const int ardlen, int secflag) static int log_txt(char *name, unsigned char *p, const int ardlen, int flag)
{ {
unsigned char *p1 = p; unsigned char *p1 = p;
@@ -615,7 +615,7 @@ static int log_txt(char *name, unsigned char *p, const int ardlen, int secflag)
} }
*p3 = 0; *p3 = 0;
log_query(secflag | F_FORWARD, name, NULL, (char*)p1, 0); log_query(flag, name, NULL, (char*)p1, 0);
/* restore */ /* restore */
memmove(p1 + 1, p1, i); memmove(p1 + 1, p1, i);
*p1 = len; *p1 = len;
@@ -786,7 +786,8 @@ int extract_addresses(struct dns_header *header, size_t qlen, char *name, time_t
addrlen = IN6ADDRSZ; addrlen = IN6ADDRSZ;
flags |= F_IPV6; flags |= F_IPV6;
} }
else if (qtype != T_CNAME && (qtype == T_SRV || rr_on_list(daemon->cache_rr, qtype))) else if (qtype != T_CNAME &&
(qtype == T_SRV || rr_on_list(daemon->cache_rr, qtype) || rr_on_list(daemon->cache_rr, T_ANY)))
flags |= F_RR; flags |= F_RR;
else else
insert = 0; /* NOTE: do not cache data from CNAME queries. */ insert = 0; /* NOTE: do not cache data from CNAME queries. */
@@ -813,12 +814,13 @@ int extract_addresses(struct dns_header *header, size_t qlen, char *name, time_t
GETSHORT(ardlen, p1); GETSHORT(ardlen, p1);
endrr = p1+ardlen; endrr = p1+ardlen;
if (!CHECK_LEN(header, endrr, qlen, 0))
return 2; /* bad packet */
/* Not what we're looking for? */ /* Not what we're looking for? */
if (aqclass != C_IN || res == 2) if (aqclass != C_IN || res == 2)
{ {
p1 = endrr; p1 = endrr;
if (!CHECK_LEN(header, p1, qlen, 0))
return 2; /* bad packet */
continue; continue;
} }
@@ -868,11 +870,12 @@ int extract_addresses(struct dns_header *header, size_t qlen, char *name, time_t
found = 1; found = 1;
} }
else if (aqtype != qtype) else if (qtype == T_ANY || aqtype != qtype)
{ {
#ifdef HAVE_DNSSEC #ifdef HAVE_DNSSEC
if (!option_bool(OPT_DNSSEC_VALID) || aqtype != T_RRSIG) if (!option_bool(OPT_DNSSEC_VALID) || aqtype != T_RRSIG)
#endif #endif
if (qtype != T_ANY)
log_query(secflag | F_FORWARD | F_UPSTREAM | F_RRNAME, name, NULL, NULL, aqtype); log_query(secflag | F_FORWARD | F_UPSTREAM | F_RRNAME, name, NULL, NULL, aqtype);
} }
else if (!(flags & F_NXDOMAIN)) else if (!(flags & F_NXDOMAIN))
@@ -1019,26 +1022,17 @@ int extract_addresses(struct dns_header *header, size_t qlen, char *name, time_t
blockdata_free(addr.rrblock.rrdata); blockdata_free(addr.rrblock.rrdata);
} }
if (aqtype == T_TXT)
{
if (!CHECK_LEN(header, p1, qlen, ardlen))
return 2;
log_txt(name, p1, ardlen, secflag | F_UPSTREAM);
}
else
{
int negflag = F_UPSTREAM;
/* We're filtering this RRtype. It will be removed from the /* We're filtering this RRtype. It will be removed from the
returned packet in process_reply() but gets cached here anyway returned packet in process_reply() but gets cached here anyway
and will be filtered again on the way out of the cache. Here, and will be filtered again on the way out of the cache. Here,
we just need to alter the logging. */ we just need to alter the logging. */
if (rr_on_list(daemon->filter_rr, qtype)) if (rr_on_list(daemon->filter_rr, qtype))
negflag = F_NEG | F_CONFIG; secflag = F_NEG | F_CONFIG;
log_query(negflag | flags | F_FORWARD | secflag, name, &addr, NULL, aqtype); if (aqtype == T_TXT)
} log_txt(name, p1, ardlen, flags | F_FORWARD | F_UPSTREAM | secflag);
else
log_query(flags | F_FORWARD | F_UPSTREAM | secflag, name, &addr, NULL, aqtype);
} }
p1 = endrr; p1 = endrr;

View File

@@ -119,7 +119,7 @@ int rr_on_list(struct rrlist *list, unsigned short rr)
{ {
while (list) while (list)
{ {
if (list->rr == rr || list->rr == T_ANY) if (list->rr == rr)
return 1; return 1;
list = list->next; list = list->next;