fixup memleaks.

git-svn-id: file:///svn/unbound/trunk@1331 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
Wouter Wijngaards 2008-11-05 10:38:22 +00:00
parent 515b892024
commit 6c7416128c
10 changed files with 64 additions and 27 deletions

View file

@ -820,8 +820,12 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
} }
if(local_zones_answer(worker->daemon->local_zones, &qinfo, &edns, if(local_zones_answer(worker->daemon->local_zones, &qinfo, &edns,
c->buffer, worker->scratchpad)) { c->buffer, worker->scratchpad)) {
if(ldns_buffer_limit(c->buffer) == 0) {
comm_point_drop_reply(repinfo);
return 0;
}
server_stats_insrcode(&worker->stats, c->buffer); server_stats_insrcode(&worker->stats, c->buffer);
return (ldns_buffer_limit(c->buffer) != 0); return 1;
} }
if(!(LDNS_RD_WIRE(ldns_buffer_begin(c->buffer))) && if(!(LDNS_RD_WIRE(ldns_buffer_begin(c->buffer))) &&
acl != acl_allow_snoop ) { acl != acl_allow_snoop ) {

View file

@ -1,3 +1,15 @@
5 November 2008: Wouter
- fixed possible memory leak in key_entry_key deletion.
Would leak a couple bytes when trust anchors were replaced.
- if query and reply qname overlap, the bytes are skipped not copied.
- fixed file descriptor leak when messages were jostled out that
had outstanding (TCP) replies.
- DNAMEs used from cache have their synthesized CNAMEs initialized
properly.
- fixed file descriptor leak for localzone type deny (for TCP).
- fixed memleak at exit for nsec3 negative cached zones.
- fixed memleak for the keyword 'nodefault' when reading config.
4 November 2008: Wouter 4 November 2008: Wouter
- fixed -Wwrite-strings warnings that result in better code. - fixed -Wwrite-strings warnings that result in better code.

View file

@ -483,7 +483,7 @@ synth_dname_msg(struct ub_packed_rrset_key* rrset, struct regional* region,
return NULL; return NULL;
ck->rk.dname_len = q->qname_len; ck->rk.dname_len = q->qname_len;
ck->entry.hash = rrset_key_hash(&ck->rk); ck->entry.hash = rrset_key_hash(&ck->rk);
newd = (struct packed_rrset_data*)regional_alloc(region, newd = (struct packed_rrset_data*)regional_alloc_zero(region,
sizeof(struct packed_rrset_data) + sizeof(size_t) + sizeof(struct packed_rrset_data) + sizeof(size_t) +
sizeof(uint8_t*) + sizeof(uint32_t) + sizeof(uint16_t) sizeof(uint8_t*) + sizeof(uint32_t) + sizeof(uint16_t)
+ newlen); + newlen);

View file

@ -397,6 +397,7 @@ mesh_state_create(struct module_env* env, struct query_info* qinfo,
mstate->run_node.key = mstate; mstate->run_node.key = mstate;
mstate->reply_list = NULL; mstate->reply_list = NULL;
mstate->list_select = mesh_no_list; mstate->list_select = mesh_no_list;
mstate->replies_sent = 0;
rbtree_init(&mstate->super_set, &mesh_state_ref_compare); rbtree_init(&mstate->super_set, &mesh_state_ref_compare);
rbtree_init(&mstate->sub_set, &mesh_state_ref_compare); rbtree_init(&mstate->sub_set, &mesh_state_ref_compare);
mstate->num_activated = 0; mstate->num_activated = 0;
@ -435,6 +436,14 @@ mesh_state_cleanup(struct mesh_state* mstate)
int i; int i;
if(!mstate) if(!mstate)
return; return;
/* drop unsent replies */
if(!mstate->replies_sent) {
struct mesh_reply* rep;
for(rep=mstate->reply_list; rep; rep=rep->next) {
comm_point_drop_reply(&rep->query_reply);
}
}
/* de-init modules */ /* de-init modules */
mesh = mstate->s.env->mesh; mesh = mstate->s.env->mesh;
for(i=0; i<mesh->mods.num; i++) { for(i=0; i<mesh->mods.num; i++) {
@ -700,6 +709,7 @@ void mesh_query_done(struct mesh_state* mstate)
mesh_send_reply(mstate, mstate->s.return_rcode, rep, r, prev); mesh_send_reply(mstate, mstate->s.return_rcode, rep, r, prev);
prev = r; prev = r;
} }
mstate->replies_sent = 1;
for(c = mstate->cb_list; c; c = c->next) { for(c = mstate->cb_list; c; c = c->next) {
mesh_do_callback(mstate, mstate->s.return_rcode, rep, c); mesh_do_callback(mstate, mstate->s.return_rcode, rep, c);
} }

View file

@ -168,6 +168,9 @@ struct mesh_state {
/** if this state is in the forever list, jostle list, or neither */ /** if this state is in the forever list, jostle list, or neither */
enum mesh_list_select { mesh_no_list, mesh_forever_list, enum mesh_list_select { mesh_no_list, mesh_forever_list,
mesh_jostle_list } list_select; mesh_jostle_list } list_select;
/** true if replies have been sent out (at end for alignment) */
uint8_t replies_sent;
}; };
/** /**

View file

@ -709,10 +709,10 @@ static const yytype_uint16 yyrline[] =
475, 482, 489, 500, 508, 521, 530, 539, 547, 560, 475, 482, 489, 500, 508, 521, 530, 539, 547, 560,
569, 578, 587, 596, 609, 616, 626, 636, 646, 656, 569, 578, 587, 596, 609, 616, 626, 636, 646, 656,
666, 676, 683, 690, 699, 706, 716, 730, 737, 755, 666, 676, 683, 690, 699, 706, 716, 730, 737, 755,
764, 773, 783, 793, 800, 808, 821, 829, 848, 855, 764, 773, 783, 793, 800, 808, 821, 829, 849, 856,
870, 877, 884, 891, 901, 908, 915, 922, 927, 928, 871, 878, 885, 892, 902, 909, 916, 923, 928, 929,
929, 929, 929, 930, 930, 930, 931, 933, 943, 952, 930, 930, 930, 931, 931, 931, 932, 934, 944, 953,
959, 966, 973, 980 960, 967, 974, 981
}; };
#endif #endif
@ -2701,6 +2701,7 @@ yyreduce:
if(!cfg_strlist_insert(&cfg_parser->cfg-> if(!cfg_strlist_insert(&cfg_parser->cfg->
local_zones_nodefault, (yyvsp[(2) - (3)].str))) local_zones_nodefault, (yyvsp[(2) - (3)].str)))
fatal_exit("out of memory adding local-zone"); fatal_exit("out of memory adding local-zone");
free((yyvsp[(3) - (3)].str));
} else { } else {
if(!cfg_str2list_insert(&cfg_parser->cfg->local_zones, if(!cfg_str2list_insert(&cfg_parser->cfg->local_zones,
(yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str))) (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str)))
@ -2710,7 +2711,7 @@ yyreduce:
break; break;
case 168: case 168:
#line 849 "util/configparser.y" #line 850 "util/configparser.y"
{ {
OUTYY(("P(server_local_data:%s)\n", (yyvsp[(2) - (2)].str))); OUTYY(("P(server_local_data:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->local_data, (yyvsp[(2) - (2)].str))) if(!cfg_strlist_insert(&cfg_parser->cfg->local_data, (yyvsp[(2) - (2)].str)))
@ -2719,7 +2720,7 @@ yyreduce:
break; break;
case 169: case 169:
#line 856 "util/configparser.y" #line 857 "util/configparser.y"
{ {
char* ptr; char* ptr;
OUTYY(("P(server_local_data_ptr:%s)\n", (yyvsp[(2) - (2)].str))); OUTYY(("P(server_local_data_ptr:%s)\n", (yyvsp[(2) - (2)].str)));
@ -2736,7 +2737,7 @@ yyreduce:
break; break;
case 170: case 170:
#line 871 "util/configparser.y" #line 872 "util/configparser.y"
{ {
OUTYY(("P(name:%s)\n", (yyvsp[(2) - (2)].str))); OUTYY(("P(name:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->stubs->name); free(cfg_parser->cfg->stubs->name);
@ -2745,7 +2746,7 @@ yyreduce:
break; break;
case 171: case 171:
#line 878 "util/configparser.y" #line 879 "util/configparser.y"
{ {
OUTYY(("P(stub-host:%s)\n", (yyvsp[(2) - (2)].str))); OUTYY(("P(stub-host:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->hosts, (yyvsp[(2) - (2)].str))) if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->hosts, (yyvsp[(2) - (2)].str)))
@ -2754,7 +2755,7 @@ yyreduce:
break; break;
case 172: case 172:
#line 885 "util/configparser.y" #line 886 "util/configparser.y"
{ {
OUTYY(("P(stub-addr:%s)\n", (yyvsp[(2) - (2)].str))); OUTYY(("P(stub-addr:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->addrs, (yyvsp[(2) - (2)].str))) if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->addrs, (yyvsp[(2) - (2)].str)))
@ -2763,7 +2764,7 @@ yyreduce:
break; break;
case 173: case 173:
#line 892 "util/configparser.y" #line 893 "util/configparser.y"
{ {
OUTYY(("P(stub-prime:%s)\n", (yyvsp[(2) - (2)].str))); OUTYY(("P(stub-prime:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@ -2775,7 +2776,7 @@ yyreduce:
break; break;
case 174: case 174:
#line 902 "util/configparser.y" #line 903 "util/configparser.y"
{ {
OUTYY(("P(name:%s)\n", (yyvsp[(2) - (2)].str))); OUTYY(("P(name:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->forwards->name); free(cfg_parser->cfg->forwards->name);
@ -2784,7 +2785,7 @@ yyreduce:
break; break;
case 175: case 175:
#line 909 "util/configparser.y" #line 910 "util/configparser.y"
{ {
OUTYY(("P(forward-host:%s)\n", (yyvsp[(2) - (2)].str))); OUTYY(("P(forward-host:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->hosts, (yyvsp[(2) - (2)].str))) if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->hosts, (yyvsp[(2) - (2)].str)))
@ -2793,7 +2794,7 @@ yyreduce:
break; break;
case 176: case 176:
#line 916 "util/configparser.y" #line 917 "util/configparser.y"
{ {
OUTYY(("P(forward-addr:%s)\n", (yyvsp[(2) - (2)].str))); OUTYY(("P(forward-addr:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->addrs, (yyvsp[(2) - (2)].str))) if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->addrs, (yyvsp[(2) - (2)].str)))
@ -2802,14 +2803,14 @@ yyreduce:
break; break;
case 177: case 177:
#line 923 "util/configparser.y" #line 924 "util/configparser.y"
{ {
OUTYY(("\nP(remote-control:)\n")); OUTYY(("\nP(remote-control:)\n"));
} }
break; break;
case 187: case 187:
#line 934 "util/configparser.y" #line 935 "util/configparser.y"
{ {
OUTYY(("P(control_enable:%s)\n", (yyvsp[(2) - (2)].str))); OUTYY(("P(control_enable:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0) if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
@ -2821,7 +2822,7 @@ yyreduce:
break; break;
case 188: case 188:
#line 944 "util/configparser.y" #line 945 "util/configparser.y"
{ {
OUTYY(("P(control_port:%s)\n", (yyvsp[(2) - (2)].str))); OUTYY(("P(control_port:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0) if(atoi((yyvsp[(2) - (2)].str)) == 0)
@ -2832,7 +2833,7 @@ yyreduce:
break; break;
case 189: case 189:
#line 953 "util/configparser.y" #line 954 "util/configparser.y"
{ {
OUTYY(("P(control_interface:%s)\n", (yyvsp[(2) - (2)].str))); OUTYY(("P(control_interface:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->control_ifs, (yyvsp[(2) - (2)].str))) if(!cfg_strlist_insert(&cfg_parser->cfg->control_ifs, (yyvsp[(2) - (2)].str)))
@ -2841,7 +2842,7 @@ yyreduce:
break; break;
case 190: case 190:
#line 960 "util/configparser.y" #line 961 "util/configparser.y"
{ {
OUTYY(("P(rc_server_key_file:%s)\n", (yyvsp[(2) - (2)].str))); OUTYY(("P(rc_server_key_file:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->server_key_file); free(cfg_parser->cfg->server_key_file);
@ -2850,7 +2851,7 @@ yyreduce:
break; break;
case 191: case 191:
#line 967 "util/configparser.y" #line 968 "util/configparser.y"
{ {
OUTYY(("P(rc_server_cert_file:%s)\n", (yyvsp[(2) - (2)].str))); OUTYY(("P(rc_server_cert_file:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->server_cert_file); free(cfg_parser->cfg->server_cert_file);
@ -2859,7 +2860,7 @@ yyreduce:
break; break;
case 192: case 192:
#line 974 "util/configparser.y" #line 975 "util/configparser.y"
{ {
OUTYY(("P(rc_control_key_file:%s)\n", (yyvsp[(2) - (2)].str))); OUTYY(("P(rc_control_key_file:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->control_key_file); free(cfg_parser->cfg->control_key_file);
@ -2868,7 +2869,7 @@ yyreduce:
break; break;
case 193: case 193:
#line 981 "util/configparser.y" #line 982 "util/configparser.y"
{ {
OUTYY(("P(rc_control_cert_file:%s)\n", (yyvsp[(2) - (2)].str))); OUTYY(("P(rc_control_cert_file:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->control_cert_file); free(cfg_parser->cfg->control_cert_file);
@ -2878,7 +2879,7 @@ yyreduce:
/* Line 1267 of yacc.c. */ /* Line 1267 of yacc.c. */
#line 2882 "util/configparser.c" #line 2883 "util/configparser.c"
default: break; default: break;
} }
YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@ -3092,7 +3093,7 @@ yyreturn:
} }
#line 987 "util/configparser.y" #line 988 "util/configparser.y"
/* parse helper routines could be here */ /* parse helper routines could be here */

View file

@ -838,6 +838,7 @@ server_local_zone: VAR_LOCAL_ZONE STRING STRING
if(!cfg_strlist_insert(&cfg_parser->cfg-> if(!cfg_strlist_insert(&cfg_parser->cfg->
local_zones_nodefault, $2)) local_zones_nodefault, $2))
fatal_exit("out of memory adding local-zone"); fatal_exit("out of memory adding local-zone");
free($3);
} else { } else {
if(!cfg_str2list_insert(&cfg_parser->cfg->local_zones, if(!cfg_str2list_insert(&cfg_parser->cfg->local_zones,
$2, $3)) $2, $3))

View file

@ -586,7 +586,9 @@ insert_query(struct query_info* qinfo, struct compress_tree_node** tree,
dname_count_labels(qinfo->qname), dname_count_labels(qinfo->qname),
ldns_buffer_position(buffer), region, NULL, tree)) ldns_buffer_position(buffer), region, NULL, tree))
return RETVAL_OUTMEM; return RETVAL_OUTMEM;
ldns_buffer_write(buffer, qinfo->qname, qinfo->qname_len); if(ldns_buffer_current(buffer) == qinfo->qname)
ldns_buffer_skip(buffer, qinfo->qname_len);
else ldns_buffer_write(buffer, qinfo->qname, qinfo->qname_len);
ldns_buffer_write_u16(buffer, qinfo->qtype); ldns_buffer_write_u16(buffer, qinfo->qtype);
ldns_buffer_write_u16(buffer, qinfo->qclass); ldns_buffer_write_u16(buffer, qinfo->qclass);
return RETVAL_OK; return RETVAL_OK;
@ -782,7 +784,9 @@ error_encode(ldns_buffer* buf, int r, struct query_info* qinfo,
ldns_buffer_write(buf, &flags, sizeof(uint16_t)); ldns_buffer_write(buf, &flags, sizeof(uint16_t));
ldns_buffer_write(buf, &flags, sizeof(uint16_t)); ldns_buffer_write(buf, &flags, sizeof(uint16_t));
if(qinfo) { if(qinfo) {
ldns_buffer_write(buf, qinfo->qname, qinfo->qname_len); if(ldns_buffer_current(buf) == qinfo->qname)
ldns_buffer_skip(buf, qinfo->qname_len);
else ldns_buffer_write(buf, qinfo->qname, qinfo->qname_len);
ldns_buffer_write_u16(buf, qinfo->qtype); ldns_buffer_write_u16(buf, qinfo->qtype);
ldns_buffer_write_u16(buf, qinfo->qclass); ldns_buffer_write_u16(buf, qinfo->qclass);
} }

View file

@ -77,6 +77,7 @@ key_entry_delkeyfunc(void* key, void* ATTR_UNUSED(userarg))
struct key_entry_key* kk = (struct key_entry_key*)key; struct key_entry_key* kk = (struct key_entry_key*)key;
if(!key) if(!key)
return; return;
lock_rw_destroy(&kk->entry.lock);
free(kk->name); free(kk->name);
free(kk); free(kk);
} }

View file

@ -117,6 +117,7 @@ neg_clear_zones(rbnode_t* n, void* ATTR_UNUSED(arg))
struct val_neg_zone* z = (struct val_neg_zone*)n; struct val_neg_zone* z = (struct val_neg_zone*)n;
/* delete all the rrset entries in the tree */ /* delete all the rrset entries in the tree */
traverse_postorder(&z->tree, &neg_clear_datas, NULL); traverse_postorder(&z->tree, &neg_clear_datas, NULL);
free(z->nsec3_salt);
free(z->name); free(z->name);
free(z); free(z);
} }