From 8fd7b7a153d25bae72a168d811462de9e779c1e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jerry=20Lundstr=C3=B6m?= Date: Fri, 30 Jun 2023 09:21:48 +0200 Subject: [PATCH] EDNS parsing - Only parse entire DNS message if EDNS indexers are used --- src/dns_message.c | 4 ++-- src/dns_protocol.c | 4 ++++ src/dns_protocol.h | 2 ++ src/edns_bufsiz_index.c | 6 ++++++ src/edns_bufsiz_index.h | 1 + src/edns_version_index.c | 6 ++++++ src/edns_version_index.h | 1 + 7 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/dns_message.c b/src/dns_message.c index a6e55da9..f13c8a8c 100644 --- a/src/dns_message.c +++ b/src/dns_message.c @@ -104,8 +104,8 @@ static indexer indexers[] = { { "certain_qnames", 0, certain_qnames_indexer, certain_qnames_iterator }, { "query_classification", 0, query_classification_indexer, query_classification_iterator }, { "idn_qname", 0, idn_qname_indexer, idn_qname_iterator }, - { "edns_version", 0, edns_version_indexer, edns_version_iterator }, - { "edns_bufsiz", 0, edns_bufsiz_indexer, edns_bufsiz_iterator }, + { "edns_version", edns_version_init, edns_version_indexer, edns_version_iterator }, + { "edns_bufsiz", edns_bufsiz_init, edns_bufsiz_indexer, edns_bufsiz_iterator }, { "do_bit", 0, do_bit_indexer, do_bit_iterator }, { "rd_bit", 0, rd_bit_indexer, rd_bit_iterator }, { "tc_bit", 0, tc_bit_indexer, tc_bit_iterator }, diff --git a/src/dns_protocol.c b/src/dns_protocol.c index e4498a67..2e72b766 100644 --- a/src/dns_protocol.c +++ b/src/dns_protocol.c @@ -255,6 +255,8 @@ static off_t skip_rr(const u_char* buf, int len, off_t offset) return offset; } +int dns_protocol_parse_edns0 = 0; + int dns_protocol_handler(const u_char* buf, int len, void* udata) { transport_message* tm = udata; @@ -304,6 +306,8 @@ int dns_protocol_handler(const u_char* buf, int len, void* udata) offset = new_offset; qdcount--; } + if (!dns_protocol_parse_edns0) + goto handle_m; assert(offset <= len); /* diff --git a/src/dns_protocol.h b/src/dns_protocol.h index 689fed02..90b8f454 100644 --- a/src/dns_protocol.h +++ b/src/dns_protocol.h @@ -39,6 +39,8 @@ #include +extern int dns_protocol_parse_edns0; + int dns_protocol_handler(const u_char* buf, int len, void* udata); #endif /* __dsc_dns_protocol_h */ diff --git a/src/edns_bufsiz_index.c b/src/edns_bufsiz_index.c index 27f5d74e..3d67be76 100644 --- a/src/edns_bufsiz_index.c +++ b/src/edns_bufsiz_index.c @@ -37,6 +37,12 @@ #include "config.h" #include "edns_bufsiz_index.h" +#include "dns_protocol.h" + +void edns_bufsiz_init(void) +{ + dns_protocol_parse_edns0 = 1; +} int edns_bufsiz_max = 0; diff --git a/src/edns_bufsiz_index.h b/src/edns_bufsiz_index.h index d1253485..c9961778 100644 --- a/src/edns_bufsiz_index.h +++ b/src/edns_bufsiz_index.h @@ -39,6 +39,7 @@ #include "dns_message.h" +void edns_bufsiz_init(void); int edns_bufsiz_indexer(const dns_message*); int edns_bufsiz_iterator(const char** label); diff --git a/src/edns_version_index.c b/src/edns_version_index.c index d7b6f380..587f5dca 100644 --- a/src/edns_version_index.c +++ b/src/edns_version_index.c @@ -37,6 +37,12 @@ #include "config.h" #include "edns_version_index.h" +#include "dns_protocol.h" + +void edns_version_init(void) +{ + dns_protocol_parse_edns0 = 1; +} int edns_version_max = 0; diff --git a/src/edns_version_index.h b/src/edns_version_index.h index 444b622f..b30d3e08 100644 --- a/src/edns_version_index.h +++ b/src/edns_version_index.h @@ -39,6 +39,7 @@ #include "dns_message.h" +void edns_version_init(void); int edns_version_indexer(const dns_message*); int edns_version_iterator(const char** label);