]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
- Fix to move msgparse_rrset_remove_rr code to util/msgparse.c.
authorW.C.A. Wijngaards <wouter@nlnetlabs.nl>
Thu, 7 Sep 2023 09:29:53 +0000 (11:29 +0200)
committerW.C.A. Wijngaards <wouter@nlnetlabs.nl>
Thu, 7 Sep 2023 09:29:53 +0000 (11:29 +0200)
Makefile.in
doc/Changelog
iterator/iter_priv.c
iterator/iter_priv.h
iterator/iter_scrub.c
testdata/iter_scrub_rr_length.rpl
util/data/msgparse.c
util/data/msgparse.h

index 0a2e7f9b6f08f824b77ac7f8dbea35532d00f502..627a650f6f938bfc66a2a8c4e434b0d1113888fc 100644 (file)
@@ -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 \
index fe03f43785921a54e59472e5ca302a662fc7db77..a9f74ab759d296c07752650a6f73fcf591de871d 100644 (file)
@@ -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.
index 675c9390790b0a532eac02750b28435e379cf847..be4219216a4cdd7f10d99f5117e595de7027d313 100644 (file)
@@ -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;
                                }
index 7f58ec2f70089216b21b2adc01f530d9332ed257..0430d57e3e3bffe2fd664956fef2a65845ca21ea 100644 (file)
@@ -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 */
index c34ccfd3cb95bbbe00ca1b892d34469b9f64b920..a7d60e4b2195e8367313c11a502b23b1a3e0401a 100644 (file)
@@ -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;
index ccb791eb2c465b9cb492c941e8268018be6265b4..14bd55265c05ee6026d3690e40f1fa3c6701cb72 100644 (file)
@@ -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: "."
index b5414c6d0a55475c0502dd9411427d8b663ac374..d06b7bb25e6eb76d9b60ae9f40f7b163a36275ab 100644 (file)
@@ -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;
+}
index b7dc235d677c73338d75a87f6e69cdf91089cd59..8e5c94a28cba7e17d6e279b152fac4c24c55a7be 100644 (file)
@@ -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 */