cleaner allocation code.

git-svn-id: file:///svn/unbound/trunk@355 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
Wouter Wijngaards 2007-06-01 12:05:48 +00:00
parent 28f9864b53
commit ef6480b696
4 changed files with 42 additions and 23 deletions

View file

@ -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;
}

View 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 */

View 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;

View 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;
}