From 4016aa755e290f15e6ff4880abbbbcf87be419b9 Mon Sep 17 00:00:00 2001 From: Wouter Wijngaards Date: Tue, 4 Sep 2007 07:57:06 +0000 Subject: [PATCH] No leakage warning for double serviced callback. git-svn-id: file:///svn/unbound/trunk@582 be551aaa-1e26-0410-a405-d3ace91eadb9 --- doc/Changelog | 4 ++++ services/outside_network.c | 7 ++++++- services/outside_network.h | 3 +++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/doc/Changelog b/doc/Changelog index e6707f5b9..ceb4871e8 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,3 +1,7 @@ +4 September 2007: Wouter + - fixup of Leakage warning when serviced queries processed multiple + callbacks for the same query from the same server. + 3 September 2007: Wouter - Fixed error in iterator that would cause assertion failure in validator. CNAME to a NXDOMAIN response was collated into a response diff --git a/services/outside_network.c b/services/outside_network.c index e94840f04..b392310c2 100644 --- a/services/outside_network.c +++ b/services/outside_network.c @@ -434,6 +434,7 @@ outside_network_create(struct comm_base *base, size_t bufsize, outnet->num_tcp = num_tcp; outnet->infra = infra; outnet->rnd = rnd; + outnet->svcd_overhead = 0; #ifndef INET6 do_ip6 = 0; #endif @@ -996,6 +997,7 @@ serviced_callbacks(struct serviced_query* sq, int error, struct comm_point* c, error = NETEVENT_CLOSED; c = NULL; } + sq->outnet->svcd_overhead = backlen; } while(p) { n = p->next; @@ -1007,8 +1009,10 @@ serviced_callbacks(struct serviced_query* sq, int error, struct comm_point* c, (void)(*p->cb)(c, p->cb_arg, error, rep); p = n; } - if(backup_p) + if(backup_p) { free(backup_p); + sq->outnet->svcd_overhead = 0; + } verbose(VERB_ALGO, "svcd callbacks end"); log_assert(sq->cblist == NULL); serviced_delete(sq); @@ -1260,6 +1264,7 @@ size_t outnet_get_mem(struct outside_network* outnet) s += (sizeof(struct pending) + comm_timer_get_mem(NULL)) * outnet->pending->count; s += sizeof(*outnet->serviced); + s += outnet->svcd_overhead; RBTREE_FOR(sq, struct serviced_query*, outnet->serviced) { s += sizeof(*sq) + sq->qbuflen; for(sb = sq->cblist; sb; sb = sb->next) diff --git a/services/outside_network.h b/services/outside_network.h index 2e521661c..283453fee 100644 --- a/services/outside_network.h +++ b/services/outside_network.h @@ -64,6 +64,9 @@ struct outside_network { /** buffer shared by UDP connections, since there is only one datagram at any time. */ ldns_buffer* udp_buff; + /** serviced_callbacks malloc overhead when processing multiple + * identical serviced queries to the same server. */ + size_t svcd_overhead; /** * Array of udp comm point* that are used to listen to pending events. -- 2.47.2