From: Wouter Wijngaards Date: Fri, 1 Jun 2007 12:05:48 +0000 (+0000) Subject: cleaner allocation code. X-Git-Tag: release-0.4~111 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ef6480b696119be66219a1a1f105df8f13c1db1d;p=thirdparty%2Funbound.git cleaner allocation code. git-svn-id: file:///svn/unbound/trunk@355 be551aaa-1e26-0410-a405-d3ace91eadb9 --- diff --git a/iterator/iter_utils.c b/iterator/iter_utils.c index 598293280..d0d9cc413 100644 --- a/iterator/iter_utils.c +++ b/iterator/iter_utils.c @@ -45,11 +45,13 @@ #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; +} diff --git a/iterator/iter_utils.h b/iterator/iter_utils.h index b0768dc06..7954b07fe 100644 --- a/iterator/iter_utils.h +++ b/iterator/iter_utils.h @@ -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 */ diff --git a/iterator/iterator.c b/iterator/iterator.c index c6c22f00b..e4d6e84a2 100644 --- a/iterator/iterator.c +++ b/iterator/iterator.c @@ -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; diff --git a/util/data/msgreply.c b/util/data/msgreply.c index 23fdfaeb2..d49b3e895 100644 --- a/util/data/msgreply.c +++ b/util/data/msgreply.c @@ -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; }