From: Wouter Wijngaards Date: Wed, 15 Feb 2012 08:50:17 +0000 (+0000) Subject: - Fix forward-zone memory, uses malloc and frees original root dp. X-Git-Tag: release-1.4.17rc1~52 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7a58fdcebc438e7a13a0f67915d294c338c10574;p=thirdparty%2Funbound.git - Fix forward-zone memory, uses malloc and frees original root dp. git-svn-id: file:///svn/unbound/trunk@2621 be551aaa-1e26-0410-a405-d3ace91eadb9 --- diff --git a/daemon/remote.c b/daemon/remote.c index 89c1fae9d..5936cc307 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -1389,9 +1389,6 @@ do_forward(SSL* ssl, struct worker* worker, char* args) * the actual mesh is not running, so we can freely edit it. */ /* delete all the existing queries first */ mesh_delete_all(worker->env.mesh); - /* reset the fwd structure ; the cfg is unchanged (shared by threads)*/ - /* this reset frees up memory */ - forwards_apply_cfg(fwd, worker->env.cfg); if(strcmp(args, "off") == 0) { forwards_delete_zone(fwd, LDNS_RR_CLASS_IN, root); } else { diff --git a/doc/Changelog b/doc/Changelog index 25fb0c5ef..66cf945d7 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,3 +1,6 @@ +15 February 2012: Wouter + - Fix forward-zone memory, uses malloc and frees original root dp. + 14 February 2012: Wouter - Fix sticky NS (ghost domain problem) if prefetch is yes. - iter forwards uses malloc inside for more dynamicity. diff --git a/iterator/iter_fwd.c b/iterator/iter_fwd.c index c3c8fd045..d294920e5 100644 --- a/iterator/iter_fwd.c +++ b/iterator/iter_fwd.c @@ -432,9 +432,25 @@ forwards_get_mem(struct iter_forwards* fwd) return s; } +static struct iter_forward_zone* +fwd_zone_find(struct iter_forwards* fwd, uint16_t c, uint8_t* nm) +{ + struct iter_forward_zone key; + key.node.key = &key; + key.dclass = c; + key.name = nm; + key.namelabs = dname_count_size_labels(nm, &key.namelen); + return (struct iter_forward_zone*)rbtree_search(fwd->tree, &key); +} + int forwards_add_zone(struct iter_forwards* fwd, uint16_t c, struct delegpt* dp) { + struct iter_forward_zone *z; + if((z=fwd_zone_find(fwd, c, dp->name)) != NULL) { + fwd_zone_free(z); + (void)rbtree_delete(fwd->tree, &z->node); + } if(!forwards_insert(fwd, c, dp)) return 0; fwd_init_parents(fwd); @@ -444,16 +460,11 @@ forwards_add_zone(struct iter_forwards* fwd, uint16_t c, struct delegpt* dp) void forwards_delete_zone(struct iter_forwards* fwd, uint16_t c, uint8_t* nm) { - rbnode_t* n; - struct iter_forward_zone key; - key.node.key = &key; - key.dclass = c; - key.name = nm; - key.namelabs = dname_count_size_labels(nm, &key.namelen); - if(!(n=rbtree_search(fwd->tree, &key))) + struct iter_forward_zone *z; + if(!(z=fwd_zone_find(fwd, c, nm))) return; /* nothing to do */ - fwd_zone_free((struct iter_forward_zone*)n); - (void)rbtree_delete(fwd->tree, &key); + fwd_zone_free(z); + (void)rbtree_delete(fwd->tree, &z->node); fwd_init_parents(fwd); }