From: W.C.A. Wijngaards Date: Thu, 7 Sep 2023 09:29:53 +0000 (+0200) Subject: - Fix to move msgparse_rrset_remove_rr code to util/msgparse.c. X-Git-Tag: release-1.19.0rc1~54 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=63616a5fce838549b341aad9224c3382c08b82da;p=thirdparty%2Funbound.git - Fix to move msgparse_rrset_remove_rr code to util/msgparse.c. --- diff --git a/Makefile.in b/Makefile.in index 0a2e7f9b6..627a650f6 100644 --- a/Makefile.in +++ b/Makefile.in @@ -738,7 +738,7 @@ msgencode.lo msgencode.o: $(srcdir)/util/data/msgencode.c config.h $(srcdir)/uti msgparse.lo msgparse.o: $(srcdir)/util/data/msgparse.c config.h $(srcdir)/util/data/msgparse.h \ $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/sldns/pkthdr.h \ $(srcdir)/sldns/rrdef.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/packed_rrset.h \ - $(srcdir)/util/data/dname.h $(srcdir)/util/storage/lookup3.h $(srcdir)/util/regional.h $(srcdir)/sldns/sbuffer.h \ + $(srcdir)/util/data/dname.h $(srcdir)/util/storage/lookup3.h $(srcdir)/util/regional.h $(srcdir)/util/net_help.h $(srcdir)/sldns/sbuffer.h \ $(srcdir)/sldns/parseutil.h $(srcdir)/sldns/wire2str.h msgreply.lo msgreply.o: $(srcdir)/util/data/msgreply.c config.h $(srcdir)/util/data/msgreply.h \ $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/util/data/packed_rrset.h \ diff --git a/doc/Changelog b/doc/Changelog index fe03f4378..a9f74ab75 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,6 +1,7 @@ 7 September 2023: Wouter - Fix to scrub resource records of type A and AAAA that have an inappropriate size. They are removed from responses. + - Fix to move msgparse_rrset_remove_rr code to util/msgparse.c. 6 September 2023: Wouter - Merge #931: Prevent warnings from -Wmissing-prototypes. diff --git a/iterator/iter_priv.c b/iterator/iter_priv.c index 675c93907..be4219216 100644 --- a/iterator/iter_priv.c +++ b/iterator/iter_priv.c @@ -207,31 +207,6 @@ size_t priv_get_mem(struct iter_priv* priv) return sizeof(*priv) + regional_get_mem(priv->region); } -/** remove RR from msgparse RRset, return true if rrset is entirely bad */ -int -msgparse_rrset_remove_rr(const char* str, sldns_buffer* pkt, struct rrset_parse* rrset, - struct rr_parse* prev, struct rr_parse** rr, struct sockaddr_storage* addr, socklen_t addrlen) -{ - if(verbosity >= VERB_QUERY && rrset->dname_len <= LDNS_MAX_DOMAINLEN && str) { - uint8_t buf[LDNS_MAX_DOMAINLEN+1]; - dname_pkt_copy(pkt, buf, rrset->dname); - if(addr) - log_name_addr(VERB_QUERY, str, buf, addr, addrlen); - else log_nametypeclass(VERB_QUERY, str, buf, - rrset->type, ntohs(rrset->rrset_class)); - } - if(prev) - prev->next = (*rr)->next; - else rrset->rr_first = (*rr)->next; - if(rrset->rr_last == *rr) - rrset->rr_last = prev; - rrset->rr_count --; - rrset->size -= (*rr)->size; - /* rr struct still exists, but is unlinked, so that in the for loop - * the rr->next works fine to continue. */ - return rrset->rr_count == 0; -} - int priv_rrset_bad(struct iter_priv* priv, sldns_buffer* pkt, struct rrset_parse* rrset) { @@ -264,7 +239,7 @@ int priv_rrset_bad(struct iter_priv* priv, sldns_buffer* pkt, INET_SIZE); memmove(&addr, &sa, len); if(priv_lookup_addr(priv, &addr, len)) { - if(msgparse_rrset_remove_rr("sanitize: removing public name with private address", pkt, rrset, prev, &rr, &addr, len)) + if(msgparse_rrset_remove_rr("sanitize: removing public name with private address", pkt, rrset, prev, rr, &addr, len)) return 1; continue; } @@ -287,7 +262,7 @@ int priv_rrset_bad(struct iter_priv* priv, sldns_buffer* pkt, INET6_SIZE); memmove(&addr, &sa, len); if(priv_lookup_addr(priv, &addr, len)) { - if(msgparse_rrset_remove_rr("sanitize: removing public name with private address", pkt, rrset, prev, &rr, &addr, len)) + if(msgparse_rrset_remove_rr("sanitize: removing public name with private address", pkt, rrset, prev, rr, &addr, len)) return 1; continue; } diff --git a/iterator/iter_priv.h b/iterator/iter_priv.h index 7f58ec2f7..0430d57e3 100644 --- a/iterator/iter_priv.h +++ b/iterator/iter_priv.h @@ -48,8 +48,6 @@ struct iter_env; struct config_file; struct regional; struct rrset_parse; -struct rr_parse; -struct rrset_parse; /** * Iterator priv structure @@ -111,9 +109,4 @@ int priv_rrset_bad(struct iter_priv* priv, struct sldns_buffer* pkt, */ size_t priv_get_mem(struct iter_priv* priv); -/** remove RR from msgparse RRset, return true if rrset is entirely bad */ -int msgparse_rrset_remove_rr(const char* str, struct sldns_buffer* pkt, - struct rrset_parse* rrset, struct rr_parse* prev, struct rr_parse** rr, - struct sockaddr_storage* addr, socklen_t addrlen); - #endif /* ITERATOR_ITER_PRIV_H */ diff --git a/iterator/iter_scrub.c b/iterator/iter_scrub.c index c34ccfd3c..a7d60e4b2 100644 --- a/iterator/iter_scrub.c +++ b/iterator/iter_scrub.c @@ -730,7 +730,7 @@ scrub_sanitize_rr_length(sldns_buffer* pkt, struct msg_parse* msg, * (2 bytes for length and 4 for IPv4 addr)*/ if((*rrset)->type == LDNS_RR_TYPE_A && rr->size != 6 ) { if(msgparse_rrset_remove_rr("sanitize: removing type A RR of inappropriate length:", - pkt, *rrset, rr_prev, &rr, NULL, 0)) { + pkt, *rrset, rr_prev, rr, NULL, 0)) { remove_rrset("sanitize: removing type A RRset of inappropriate length:", pkt, msg, prev, rrset); return 1; @@ -743,7 +743,7 @@ scrub_sanitize_rr_length(sldns_buffer* pkt, struct msg_parse* msg, * (2 bytes for length and 16 for IPv6 addr)*/ if((*rrset)->type == LDNS_RR_TYPE_AAAA && rr->size != 18 ) { if(msgparse_rrset_remove_rr("sanitize: removing type AAAA RR of inappropriate length:", - pkt, *rrset, rr_prev, &rr, NULL, 0)) { + pkt, *rrset, rr_prev, rr, NULL, 0)) { remove_rrset("sanitize: removing type AAAA RRset of inappropriate length:", pkt, msg, prev, rrset); return 1; diff --git a/testdata/iter_scrub_rr_length.rpl b/testdata/iter_scrub_rr_length.rpl index ccb791eb2..14bd55265 100644 --- a/testdata/iter_scrub_rr_length.rpl +++ b/testdata/iter_scrub_rr_length.rpl @@ -3,6 +3,7 @@ server: target-fetch-policy: "0 0 0 0 0" qname-minimisation: "no" minimal-responses: no + rrset-roundrobin: no stub-zone: name: "." diff --git a/util/data/msgparse.c b/util/data/msgparse.c index b5414c6d0..d06b7bb25 100644 --- a/util/data/msgparse.c +++ b/util/data/msgparse.c @@ -47,6 +47,7 @@ #include "util/regional.h" #include "util/rfc_1982.h" #include "util/edns.h" +#include "util/net_help.h" #include "sldns/rrdef.h" #include "sldns/sbuffer.h" #include "sldns/parseutil.h" @@ -1306,3 +1307,27 @@ log_edns_opt_list(enum verbosity_value level, const char* info_str, } } +/** remove RR from msgparse RRset, return true if rrset is entirely bad */ +int +msgparse_rrset_remove_rr(const char* str, sldns_buffer* pkt, struct rrset_parse* rrset, + struct rr_parse* prev, struct rr_parse* rr, struct sockaddr_storage* addr, socklen_t addrlen) +{ + if(verbosity >= VERB_QUERY && rrset->dname_len <= LDNS_MAX_DOMAINLEN && str) { + uint8_t buf[LDNS_MAX_DOMAINLEN+1]; + dname_pkt_copy(pkt, buf, rrset->dname); + if(addr) + log_name_addr(VERB_QUERY, str, buf, addr, addrlen); + else log_nametypeclass(VERB_QUERY, str, buf, + rrset->type, ntohs(rrset->rrset_class)); + } + if(prev) + prev->next = rr->next; + else rrset->rr_first = rr->next; + if(rrset->rr_last == rr) + rrset->rr_last = prev; + rrset->rr_count --; + rrset->size -= rr->size; + /* rr struct still exists, but is unlinked, so that in the for loop + * the rr->next works fine to continue. */ + return rrset->rr_count == 0; +} diff --git a/util/data/msgparse.h b/util/data/msgparse.h index b7dc235d6..8e5c94a28 100644 --- a/util/data/msgparse.h +++ b/util/data/msgparse.h @@ -371,4 +371,22 @@ void msgparse_bucket_remove(struct msg_parse* msg, struct rrset_parse* rrset); void log_edns_opt_list(enum verbosity_value level, const char* info_str, struct edns_option* list); +/** + * Remove RR from msgparse RRset. + * @param str: this string is used for logging if verbose. If NULL, there is + * no logging of the remove. + * @param pkt: packet in buffer that is removed from. Used to log the name + * of the item removed. + * @param rrset: RRset that the RR is removed from. + * @param prev: previous RR in list, or NULL. + * @param rr: RR that is removed. + * @param addr: address used for logging, if verbose, or NULL then it is not + * used. + * @param addrlen: length of addr, if that is not NULL. + * @return true if rrset is entirely bad, it would then need to be removed. + */ +int msgparse_rrset_remove_rr(const char* str, struct sldns_buffer* pkt, + struct rrset_parse* rrset, struct rr_parse* prev, struct rr_parse* rr, + struct sockaddr_storage* addr, socklen_t addrlen); + #endif /* UTIL_DATA_MSGPARSE_H */