]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
cleaner allocation code.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Fri, 1 Jun 2007 12:05:48 +0000 (12:05 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Fri, 1 Jun 2007 12:05:48 +0000 (12:05 +0000)
git-svn-id: file:///svn/unbound/trunk@355 be551aaa-1e26-0410-a405-d3ace91eadb9

iterator/iter_utils.c
iterator/iter_utils.h
iterator/iterator.c
util/data/msgreply.c

index 5982932806e4392a62c4159b1181390396df387d..d0d9cc4132c9a56a836bc37b0af6c2aeb1447bc4 100644 (file)
 #include "iterator/iter_hints.h"
 #include "iterator/iter_delegpt.h"
 #include "services/cache/infra.h"
+#include "services/cache/dns.h"
 #include "util/net_help.h"
 #include "util/module.h"
 #include "util/log.h"
 #include "util/config_file.h"
 #include "util/region-allocator.h"
+#include "util/data/msgparse.h"
        
 int 
 iter_apply_cfg(struct iter_env* iter_env, struct config_file* cfg)
@@ -151,3 +153,14 @@ struct delegpt_addr* iter_server_selection(struct iter_env* iter_env,
        }
        return got;
 }
+
+struct dns_msg* 
+dns_alloc_msg(struct msg_parse* msg, struct region* region)
+{
+       struct dns_msg* m = (struct dns_msg*)region_alloc(region,
+               sizeof(struct dns_msg));
+       if(!m)
+               return NULL;
+       memset(m, 0, sizeof(*m));
+       return m;
+}
index b0768dc0695c748a451577dc2b7e5768cedbec79..7954b07feb79ac210a24c65c7218c3fb7ca66e05 100644 (file)
@@ -47,6 +47,8 @@ struct config_file;
 struct module_env;
 struct delegpt_addr;
 struct delegpt;
+struct region;
+struct msg_parse;
 
 /**
  * Process config options and set iterator module state.
@@ -74,4 +76,12 @@ struct delegpt_addr* iter_server_selection(struct iter_env* iter_env,
        struct module_env* env, struct delegpt* dp, uint8_t* name, 
        size_t namelen);
 
+/**
+ * Allocate dns_msg from parsed msg, in region.
+ * @param msg: parsed message (cleaned and ready for region allocation).
+ * @param region: region to use for allocation.
+ * @return newly allocated dns_msg, or NULL on memory error.
+ */
+struct dns_msg* dns_alloc_msg(struct msg_parse* msg, struct region* region);
+
 #endif /* ITERATOR_ITER_UTILS_H */
index c6c22f00be6da5d6e4401f92dab2162d85d65b55..e4d6e84a2c7f19b7486117426c7a47782471a32d 100644 (file)
@@ -1223,9 +1223,7 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq,
                goto handle_it;
 
        /* allocate response dns_msg in region */
-       /* TODO:
-       iq->response = dns_parse_to_msg(prs, qstate->region);
-       */
+       iq->response = dns_alloc_msg(prs, qstate->region);
        if(!iq->response)
                goto handle_it;
 
index 23fdfaeb259375c0061c6942c40e7fe5df160120..d49b3e895590cf99d2d0be95aa1522e8f8dd6fff 100644 (file)
@@ -226,7 +226,7 @@ parse_rr_copy(ldns_buffer* pkt, struct rrset_parse* pset,
        return 1;
 }
 
-/** create rrset return 0 or rcode */
+/** create rrset return 0 on failure */
 static int
 parse_create_rrset(ldns_buffer* pkt, struct rrset_parse* pset,
        struct packed_rrset_data** data)
@@ -237,11 +237,11 @@ parse_create_rrset(ldns_buffer* pkt, struct rrset_parse* pset,
                (sizeof(size_t)+sizeof(uint8_t*)+sizeof(uint32_t)) + 
                pset->size);
        if(!*data)
-               return LDNS_RCODE_SERVFAIL;
+               return 0;
        /* copy & decompress */
        if(!parse_rr_copy(pkt, pset, *data))
-               return LDNS_RCODE_SERVFAIL;
-       return 0;
+               return 0;
+       return 1;
 }
 
 /** get trust value for rrset */
@@ -274,13 +274,12 @@ get_rrset_trust(struct reply_info* rep, size_t i)
  * @param pkt: the packet for compression pointer resolution.
  * @param msg: the parsed message
  * @param rep: reply info to put rrs into.
- * @return 0 or rcode.
+ * @return 0 on failure.
  */
 static int
 parse_copy_decompress(ldns_buffer* pkt, struct msg_parse* msg,
        struct reply_info* rep)
 {
-       int ret;
        size_t i;
        struct rrset_parse *pset = msg->rrset_first;
        struct packed_rrset_data* data;
@@ -294,15 +293,15 @@ parse_copy_decompress(ldns_buffer* pkt, struct msg_parse* msg,
                rep->rrsets[i]->rk.dname_len = pset->dname_len;
                rep->rrsets[i]->rk.dname = (uint8_t*)malloc(pset->dname_len);
                if(!rep->rrsets[i]->rk.dname)
-                       return LDNS_RCODE_SERVFAIL;
+                       return 0;
                /** copy & decompress dname */
                dname_pkt_copy(pkt, rep->rrsets[i]->rk.dname, pset->dname);
                /** copy over type and class */
                rep->rrsets[i]->rk.type = htons(pset->type);
                rep->rrsets[i]->rk.rrset_class = pset->rrset_class;
                /** read data part. */
-               if((ret=parse_create_rrset(pkt, pset, &data)) != 0)
-                       return ret;
+               if(!parse_create_rrset(pkt, pset, &data))
+                       return 0;
                rep->rrsets[i]->entry.data = (void*)data;
                rep->rrsets[i]->entry.key = (void*)rep->rrsets[i];
                rep->rrsets[i]->entry.hash = pset->hash;
@@ -312,26 +311,25 @@ parse_copy_decompress(ldns_buffer* pkt, struct msg_parse* msg,
 
                pset = pset->rrset_all_next;
        }
-       return 0;
+       return 1;
 }
 
-/** allocate and decompress message and rrsets, returns 0 or rcode. */
+/** allocate and decompress message and rrsets, returns 0 if failed. */
 static int 
 parse_create_msg(ldns_buffer* pkt, struct msg_parse* msg,
        struct alloc_cache* alloc, struct query_info* qinf, 
        struct reply_info** rep)
 {
-       int ret;
        log_assert(pkt && msg);
        if(!parse_create_qinfo(pkt, msg, qinf))
-               return LDNS_RCODE_SERVFAIL;
+               return 0;
        if(!parse_create_repinfo(msg, rep))
-               return LDNS_RCODE_SERVFAIL;
+               return 0;
        if(!parse_alloc_rrset_keys(msg, *rep, alloc))
-               return LDNS_RCODE_SERVFAIL;
-       if((ret=parse_copy_decompress(pkt, msg, *rep)) != 0)
-               return ret;
-       return 0;
+               return 0;
+       if(!parse_copy_decompress(pkt, msg, *rep))
+               return 0;
+       return 1;
 }
 
 int reply_info_parse(ldns_buffer* pkt, struct alloc_cache* alloc,
@@ -358,11 +356,11 @@ int reply_info_parse(ldns_buffer* pkt, struct alloc_cache* alloc,
 
        /* parse OK, allocate return structures */
        /* this also performs dname decompression */
-       if((ret = parse_create_msg(pkt, msg, alloc, qinf, rep)) != 0) {
+       if(!parse_create_msg(pkt, msg, alloc, qinf, rep)) {
                query_info_clear(qinf);
                reply_info_parsedelete(*rep, alloc);
                *rep = NULL;
-               return ret;
+               return LDNS_RCODE_SERVFAIL;
        }
        return 0;
 }