]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
Make explicit whether edns options are parsed from queries or responses
authorTom Carpay <tom@nlnetlabs.nl>
Mon, 15 Nov 2021 13:40:51 +0000 (13:40 +0000)
committerTom Carpay <tom@nlnetlabs.nl>
Mon, 15 Nov 2021 13:40:51 +0000 (13:40 +0000)
cachedb/cachedb.c
daemon/worker.c
iterator/iterator.c
pythonmod/pythonmod_utils.c
util/data/msgparse.c
util/data/msgparse.h
util/data/msgreply.c

index af4ffe5f28b5d05dd1437bad71212d1bdbd18c69..725bc6ce8b38dbec32c1470f0b9ed40ba6e0468e 100644 (file)
@@ -519,7 +519,7 @@ parse_data(struct module_qstate* qstate, struct sldns_buffer* buf)
                sldns_buffer_set_limit(buf, lim);
                return 0;
        }
-       if(parse_extract_edns(prs, &edns, qstate->env->scratch) !=
+       if(parse_extract_edns_from_response_msg(prs, &edns, qstate->env->scratch) !=
                LDNS_RCODE_NOERROR) {
                sldns_buffer_set_limit(buf, lim);
                return 0;
index 8880cac19977f4d93475eb75837b6f4d65fcb539..5d2483cd2cd94060eab85a66c8c76049bf260174 100644 (file)
@@ -1239,7 +1239,7 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
                }
                goto send_reply;
        }
-       if((ret=parse_edns_from_pkt(c->buffer, &edns, worker->env.cfg, c,
+       if((ret=parse_edns_from_query_pkt(c->buffer, &edns, worker->env.cfg, c,
                                        worker->scratchpad)) != 0) {
                struct edns_data reply_edns;
                verbose(VERB_ALGO, "worker parse edns: formerror.");
index 64a0602d5181a4f3ed4cf95eaac48fb6fe1676fe..55d53da63d9a0dd4009091d4bac39971739dab09 100644 (file)
@@ -3852,7 +3852,7 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq,
                goto handle_it;
        }
        /* edns is not examined, but removed from message to help cache */
-       if(parse_extract_edns(prs, &edns, qstate->env->scratch) !=
+       if(parse_extract_edns_from_response_msg(prs, &edns, qstate->env->scratch) !=
                LDNS_RCODE_NOERROR) {
                iq->parse_failures++;
                goto handle_it;
index 21a16bbe85bfc113d59cd26089a765313cc0de92..34a20ba764853941e12155bd48ee15bbac8d5f25 100644 (file)
@@ -132,7 +132,7 @@ int createResponse(struct module_qstate* qstate, sldns_buffer* pkt)
                return 0;
        }
        /* edns is not examined, but removed from message to help cache */
-       if(parse_extract_edns(prs, &edns, qstate->env->scratch) !=
+       if(parse_extract_edns_from_response_msg(prs, &edns, qstate->env->scratch) !=
                LDNS_RCODE_NOERROR)
                return 0;
 
index fcf2f232524dc9c0a996047b3e2b6728ec47383d..415973cdda833588c80b90b07a765f23379be7f5 100644 (file)
@@ -953,7 +953,7 @@ edns_opt_list_append_keepalive(struct edns_option** list, int msec,
 
 /** parse EDNS options from EDNS wireformat rdata */
 static int
-parse_edns_options(uint8_t* rdata_ptr, size_t rdata_len,
+parse_edns_options_from_query(uint8_t* rdata_ptr, size_t rdata_len,
        struct edns_data* edns, struct config_file* cfg, struct comm_point* c,
        struct regional* region)
 {
@@ -1044,8 +1044,8 @@ parse_edns_options(uint8_t* rdata_ptr, size_t rdata_len,
 }
 
 int 
-parse_extract_edns(struct msg_parse* msg, struct edns_data* edns,
-       struct regional* region)
+parse_extract_edns_from_response_msg(struct msg_parse* msg,
+       struct edns_data* edns, struct regional* region)
 {
        struct rrset_parse* rrset = msg->rrset_first;
        struct rrset_parse* prev = 0;
@@ -1107,11 +1107,26 @@ parse_extract_edns(struct msg_parse* msg, struct edns_data* edns,
        /* take the options */
        rdata_len = found->rr_first->size-2;
        rdata_ptr = found->rr_first->ttl_data+6;
-       if(parse_edns_options(rdata_ptr, rdata_len, edns, NULL, NULL, region))
-               return LDNS_RCODE_NOERROR;
 
-       /* ignore rrsigs */
+       /* while still more options, and have code+len to read */
+       /* ignores partial content (i.e. rdata len 3) */
+       while(rdata_len >= 4) {
+               uint16_t opt_code = sldns_read_uint16(rdata_ptr);
+               uint16_t opt_len = sldns_read_uint16(rdata_ptr+2);
+               rdata_ptr += 4;
+               rdata_len -= 4;
+               if(opt_len > rdata_len)
+                       break; /* option code partial */
 
+               if(!edns_opt_list_append(&edns->opt_list_in,
+                               opt_code, opt_len, rdata_ptr, region)) {
+                       log_err("out of memory");
+                       break;
+               }
+               rdata_ptr += opt_len;
+               rdata_len -= opt_len;
+       }
+       /* ignore rrsigs */
        return LDNS_RCODE_NOERROR;
 }
 
@@ -1142,7 +1157,7 @@ skip_pkt_rrs(sldns_buffer* pkt, int num)
 }
 
 int 
-parse_edns_from_pkt(sldns_buffer* pkt, struct edns_data* edns,
+parse_edns_from_query_pkt(sldns_buffer* pkt, struct edns_data* edns,
        struct config_file* cfg, struct comm_point* c, struct regional* region)
 {
        size_t rdata_len;
@@ -1186,7 +1201,8 @@ parse_edns_from_pkt(sldns_buffer* pkt, struct edns_data* edns,
                return LDNS_RCODE_FORMERR;
        rdata_ptr = sldns_buffer_current(pkt);
        /* ignore rrsigs */
-       return parse_edns_options(rdata_ptr, rdata_len, edns, cfg, c, region);
+       return parse_edns_options_from_query(rdata_ptr, rdata_len, edns, cfg,
+                       c, region);
 }
 
 void
index 0c70d3b15f82225d0e8be42ef6dd3f97562e4066..4c0559a739a4e755c756e5d83f8c13c0074a603d 100644 (file)
@@ -290,8 +290,8 @@ int parse_packet(struct sldns_buffer* pkt, struct msg_parse* msg,
  * @return: 0 on success. or an RCODE on an error.
  *     RCODE formerr if OPT in wrong section, and so on.
  */
-int parse_extract_edns(struct msg_parse* msg, struct edns_data* edns,
-       struct regional* region);
+int parse_extract_edns_from_response_msg(struct msg_parse* msg,
+       struct edns_data* edns, struct regional* region);
 
 /**
  * If EDNS data follows a query section, extract it and initialize edns struct.
@@ -305,7 +305,7 @@ int parse_extract_edns(struct msg_parse* msg, struct edns_data* edns,
  * @return: 0 on success, or an RCODE on error.
  *     RCODE formerr if OPT is badly formatted and so on.
  */
-int parse_edns_from_pkt(struct sldns_buffer* pkt, struct edns_data* edns,
+int parse_edns_from_query_pkt(struct sldns_buffer* pkt, struct edns_data* edns,
        struct config_file* cfg, struct comm_point* c, struct regional* region);
 
 /**
index 5fb28a9e45fb96fca30fb69381d645d0b2c45bfa..ec46e47247800e3b5e3cdf028f5e191f5202781c 100644 (file)
@@ -518,7 +518,7 @@ int reply_info_parse(sldns_buffer* pkt, struct alloc_cache* alloc,
        if((ret = parse_packet(pkt, msg, region)) != 0) {
                return ret;
        }
-       if((ret = parse_extract_edns(msg, edns, region)) != 0)
+       if((ret = parse_extract_edns_from_response_msg(msg, edns, region)) != 0)
                return ret;
 
        /* parse OK, allocate return structures */