summaryrefslogtreecommitdiff
path: root/src/forward.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/forward.c')
-rw-r--r--src/forward.c79
1 files changed, 52 insertions, 27 deletions
diff --git a/src/forward.c b/src/forward.c
index 0f03818..d79cc56 100644
--- a/src/forward.c
+++ b/src/forward.c
@@ -721,7 +721,7 @@ static size_t process_reply(struct dns_header *header, time_t now, struct server
if (added_pheader)
{
/* client didn't send EDNS0, we added one, strip it off before returning answer. */
- n = rrfilter(header, n, RRFILTER_EDNS0);
+ rrfilter(header, &n, RRFILTER_EDNS0);
pheader = NULL;
}
else
@@ -811,16 +811,6 @@ static size_t process_reply(struct dns_header *header, time_t now, struct server
}
}
- /* Before extract_addresses() */
- if (rcode == NOERROR)
- {
- if (option_bool(OPT_FILTER_A))
- n = rrfilter(header, n, RRFILTER_A);
-
- if (option_bool(OPT_FILTER_AAAA))
- n = rrfilter(header, n, RRFILTER_AAAA);
- }
-
switch (extract_addresses(header, n, daemon->namebuff, now, ipsets, nftsets, is_sign, check_rebind, no_cache, cache_secure, &doctored))
{
case 1:
@@ -839,6 +829,20 @@ static size_t process_reply(struct dns_header *header, time_t now, struct server
break;
}
+ if (rcode == NOERROR)
+ {
+ size_t modified = 0;
+
+ if (option_bool(OPT_FILTER_A))
+ modified = rrfilter(header, &n, RRFILTER_A);
+
+ if (option_bool(OPT_FILTER_AAAA))
+ modified += rrfilter(header, &n, RRFILTER_AAAA);
+
+ if (modified > 0)
+ ede = EDE_FILTERED;
+ }
+
if (doctored)
cache_secure = 0;
}
@@ -860,7 +864,7 @@ static size_t process_reply(struct dns_header *header, time_t now, struct server
/* If the requestor didn't set the DO bit, don't return DNSSEC info. */
if (!do_bit)
- n = rrfilter(header, n, RRFILTER_DNSSEC);
+ rrfilter(header, &n, RRFILTER_DNSSEC);
}
#endif
@@ -1808,7 +1812,7 @@ void receive_query(struct listener *listen, time_t now)
#endif
else
{
- int stale;
+ int stale, filtered;
int ad_reqd = do_bit;
u16 hb3 = header->hb3, hb4 = header->hb4;
int fd = listen->fd;
@@ -1818,17 +1822,28 @@ void receive_query(struct listener *listen, time_t now)
ad_reqd = 1;
m = answer_request(header, ((char *) header) + udp_size, (size_t)n,
- dst_addr_4, netmask, now, ad_reqd, do_bit, have_pseudoheader, &stale);
+ dst_addr_4, netmask, now, ad_reqd, do_bit, have_pseudoheader, &stale, &filtered);
if (m >= 1)
{
- if (stale && have_pseudoheader)
+ if (have_pseudoheader)
{
- u16 swap = htons(EDE_STALE);
+ int ede = EDE_UNSET;
- m = add_pseudoheader(header, m, ((unsigned char *) header) + udp_size, daemon->edns_pktsz,
- EDNS0_OPTION_EDE, (unsigned char *)&swap, 2, do_bit, 0);
+ if (filtered)
+ ede = EDE_FILTERED;
+ else if (stale)
+ ede = EDE_STALE;
+
+ if (ede != EDE_UNSET)
+ {
+ u16 swap = htons(ede);
+
+ m = add_pseudoheader(header, m, ((unsigned char *) header) + udp_size, daemon->edns_pktsz,
+ EDNS0_OPTION_EDE, (unsigned char *)&swap, 2, do_bit, 0);
+ }
}
+
#ifdef HAVE_DUMPFILE
dump_packet_udp(DUMP_REPLY, daemon->packet, m, NULL, &source_addr, listen->fd);
#endif
@@ -2098,7 +2113,7 @@ unsigned char *tcp_request(int confd, time_t now,
unsigned char *pheader;
unsigned int mark = 0;
int have_mark = 0;
- int first, last, stale, do_stale = 0;
+ int first, last, filtered, stale, do_stale = 0;
unsigned int flags = 0;
u16 hb3, hb4;
@@ -2292,7 +2307,7 @@ unsigned char *tcp_request(int confd, time_t now,
else
/* m > 0 if answered from cache */
m = answer_request(header, ((char *) header) + 65536, (size_t)size,
- dst_addr_4, netmask, now, ad_reqd, do_bit, have_pseudoheader, &stale);
+ dst_addr_4, netmask, now, ad_reqd, do_bit, have_pseudoheader, &stale, &filtered);
/* Do this by steam now we're not in the select() loop */
check_log_writer(1);
@@ -2431,13 +2446,23 @@ unsigned char *tcp_request(int confd, time_t now,
m = add_pseudoheader(header, m, ((unsigned char *) header) + 65536, daemon->edns_pktsz, 0, NULL, 0, do_bit, 0);
}
}
- else if (stale)
- {
- u16 swap = htons((u16)EDE_STALE);
-
- m = add_pseudoheader(header, m, ((unsigned char *) header) + 65536, daemon->edns_pktsz, EDNS0_OPTION_EDE, (unsigned char *)&swap, 2, do_bit, 0);
- }
-
+ else
+ {
+ ede = EDE_UNSET;
+
+ if (filtered)
+ ede = EDE_FILTERED;
+ else if (stale)
+ ede = EDE_STALE;
+
+ if (ede != EDE_UNSET)
+ {
+ u16 swap = htons((u16)ede);
+
+ m = add_pseudoheader(header, m, ((unsigned char *) header) + 65536, daemon->edns_pktsz, EDNS0_OPTION_EDE, (unsigned char *)&swap, 2, do_bit, 0);
+ }
+ }
+
check_log_writer(1);
*length = htons(m);