From: Wouter Wijngaards Date: Thu, 16 Jan 2014 13:04:34 +0000 (+0000) Subject: - fix #544: Fixed +i causes segfault when running with module conf "iterator". X-Git-Tag: release-1.4.22rc1~54 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=67f5157e45fdeaf4b62dc25f37a7787d059cf516;p=thirdparty%2Funbound.git - fix #544: Fixed +i causes segfault when running with module conf "iterator". git-svn-id: file:///svn/unbound/trunk@3038 be551aaa-1e26-0410-a405-d3ace91eadb9 --- diff --git a/daemon/remote.c b/daemon/remote.c index 404ff5f38..ffb0a24e5 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -1576,7 +1576,7 @@ do_forward_add(SSL* ssl, struct worker* worker, char* args) struct delegpt* dp = NULL; if(!parse_fs_args(ssl, args, &nm, &dp, &insecure, NULL)) return; - if(insecure) { + if(insecure && worker->env.anchors) { if(!anchors_add_insecure(worker->env.anchors, LDNS_RR_CLASS_IN, nm)) { (void)ssl_printf(ssl, "error out of memory\n"); @@ -1603,7 +1603,7 @@ do_forward_remove(SSL* ssl, struct worker* worker, char* args) uint8_t* nm = NULL; if(!parse_fs_args(ssl, args, &nm, NULL, &insecure, NULL)) return; - if(insecure) + if(insecure && worker->env.anchors) anchors_delete_insecure(worker->env.anchors, LDNS_RR_CLASS_IN, nm); forwards_delete_zone(fwd, LDNS_RR_CLASS_IN, nm); @@ -1621,7 +1621,7 @@ do_stub_add(SSL* ssl, struct worker* worker, char* args) struct delegpt* dp = NULL; if(!parse_fs_args(ssl, args, &nm, &dp, &insecure, &prime)) return; - if(insecure) { + if(insecure && worker->env.anchors) { if(!anchors_add_insecure(worker->env.anchors, LDNS_RR_CLASS_IN, nm)) { (void)ssl_printf(ssl, "error out of memory\n"); @@ -1631,8 +1631,9 @@ do_stub_add(SSL* ssl, struct worker* worker, char* args) } } if(!forwards_add_stub_hole(fwd, LDNS_RR_CLASS_IN, nm)) { - if(insecure) anchors_delete_insecure(worker->env.anchors, - LDNS_RR_CLASS_IN, nm); + if(insecure && worker->env.anchors) + anchors_delete_insecure(worker->env.anchors, + LDNS_RR_CLASS_IN, nm); (void)ssl_printf(ssl, "error out of memory\n"); delegpt_free_mlc(dp); free(nm); @@ -1641,8 +1642,9 @@ do_stub_add(SSL* ssl, struct worker* worker, char* args) if(!hints_add_stub(worker->env.hints, LDNS_RR_CLASS_IN, dp, !prime)) { (void)ssl_printf(ssl, "error out of memory\n"); forwards_delete_stub_hole(fwd, LDNS_RR_CLASS_IN, nm); - if(insecure) anchors_delete_insecure(worker->env.anchors, - LDNS_RR_CLASS_IN, nm); + if(insecure && worker->env.anchors) + anchors_delete_insecure(worker->env.anchors, + LDNS_RR_CLASS_IN, nm); free(nm); return; } @@ -1659,7 +1661,7 @@ do_stub_remove(SSL* ssl, struct worker* worker, char* args) uint8_t* nm = NULL; if(!parse_fs_args(ssl, args, &nm, NULL, &insecure, NULL)) return; - if(insecure) + if(insecure && worker->env.anchors) anchors_delete_insecure(worker->env.anchors, LDNS_RR_CLASS_IN, nm); forwards_delete_stub_hole(fwd, LDNS_RR_CLASS_IN, nm); @@ -1677,10 +1679,13 @@ do_insecure_add(SSL* ssl, struct worker* worker, char* arg) uint8_t* nm = NULL; if(!parse_arg_name(ssl, arg, &nm, &nmlen, &nmlabs)) return; - if(!anchors_add_insecure(worker->env.anchors, LDNS_RR_CLASS_IN, nm)) { - (void)ssl_printf(ssl, "error out of memory\n"); - free(nm); - return; + if(worker->env.anchors) { + if(!anchors_add_insecure(worker->env.anchors, + LDNS_RR_CLASS_IN, nm)) { + (void)ssl_printf(ssl, "error out of memory\n"); + free(nm); + return; + } } free(nm); send_ok(ssl); @@ -1695,7 +1700,9 @@ do_insecure_remove(SSL* ssl, struct worker* worker, char* arg) uint8_t* nm = NULL; if(!parse_arg_name(ssl, arg, &nm, &nmlen, &nmlabs)) return; - anchors_delete_insecure(worker->env.anchors, LDNS_RR_CLASS_IN, nm); + if(worker->env.anchors) + anchors_delete_insecure(worker->env.anchors, + LDNS_RR_CLASS_IN, nm); free(nm); send_ok(ssl); } diff --git a/doc/Changelog b/doc/Changelog index 5a6f61854..de6ca0c27 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,3 +1,7 @@ +16 January 2014: Wouter + - fix #544: Fixed +i causes segfault when running with module conf + "iterator". + 14 January 2014: Wouter - iana portlist updated. diff --git a/validator/val_anchor.c b/validator/val_anchor.c index a3cb1b578..3142071b8 100644 --- a/validator/val_anchor.c +++ b/validator/val_anchor.c @@ -1184,6 +1184,8 @@ anchors_get_mem(struct val_anchors* anchors) { struct trust_anchor *ta; size_t s = sizeof(*anchors); + if(!anchors) + return 0; RBTREE_FOR(ta, struct trust_anchor*, anchors->tree) { s += sizeof(*ta) + ta->namelen; /* keys and so on */