From: Wouter Wijngaards Date: Tue, 28 Aug 2007 08:03:45 +0000 (+0000) Subject: No double use of buffers. X-Git-Tag: release-0.5~89 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f293924be89d9e29a59392087831226ac3254f6e;p=thirdparty%2Funbound.git No double use of buffers. git-svn-id: file:///svn/unbound/trunk@552 be551aaa-1e26-0410-a405-d3ace91eadb9 --- diff --git a/daemon/worker.c b/daemon/worker.c index 2897540e7..b7bcb0a45 100644 --- a/daemon/worker.c +++ b/daemon/worker.c @@ -903,8 +903,6 @@ worker_init(struct worker* worker, struct config_file *cfg, worker_delete(worker); return 0; } - outside_network_set_secondary_buffer(worker->back, - worker->front->udp_buff); if(worker->thread_num != 0) { /* start listening to commands */ if(!(worker->cmd_com=comm_point_create_local(worker->base, diff --git a/doc/Changelog b/doc/Changelog index 5a6fd4eb6..4e497d38d 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,3 +1,7 @@ +28 August 2007: Wouter + - removed double use for udp buffers, that could fail, + instead performs a malloc to do the backup. + 27 August 2007: Wouter - do not garble the edns if a cache answer fails. - answer norecursive from cache if possible. diff --git a/services/outside_network.c b/services/outside_network.c index 6a4729638..14c969dca 100644 --- a/services/outside_network.c +++ b/services/outside_network.c @@ -432,7 +432,6 @@ outside_network_create(struct comm_base *base, size_t bufsize, outnet->num_tcp = num_tcp; outnet->infra = infra; outnet->rnd = rnd; - outnet->udp_second = 0; #ifndef INET6 do_ip6 = 0; #endif @@ -493,13 +492,6 @@ outside_network_create(struct comm_base *base, size_t bufsize, return outnet; } -void -outside_network_set_secondary_buffer(struct outside_network* outnet, - ldns_buffer* buf) -{ - outnet->udp_second = buf; -} - /** helper pending delete */ static void pending_node_del(rbnode_t* node, void* arg) @@ -974,6 +966,8 @@ serviced_callbacks(struct serviced_query* sq, int error, struct comm_point* c, { struct service_callback* p = sq->cblist, *n; int dobackup = (sq->cblist && sq->cblist->next); /* >1 cb*/ + uint8_t *backup_p = NULL; + size_t backlen = 0; rbnode_t* rem; /* remove from tree, and schedule for deletion, so that callbacks * can safely deregister themselves and even create new serviced @@ -987,16 +981,26 @@ serviced_callbacks(struct serviced_query* sq, int error, struct comm_point* c, * may send outgoing queries that overwrite the buffer. * use secondary buffer to store the query. * This is a data copy, but faster than packet to server */ - ldns_buffer_copy(sq->outnet->udp_second, c->buffer); + backlen = ldns_buffer_limit(c->buffer); + backup_p = memdup(ldns_buffer_begin(c->buffer), backlen); + if(!backup_p) { + log_err("malloc failure in serviced query callbacks"); + error = NETEVENT_CLOSED; + c = NULL; + } } while(p) { n = p->next; if(dobackup && c) { - ldns_buffer_copy(c->buffer, sq->outnet->udp_second); + ldns_buffer_clear(c->buffer); + ldns_buffer_write(c->buffer, backup_p, backlen); + ldns_buffer_flip(c->buffer); } (void)(*p->cb)(c, p->cb_arg, error, rep); p = n; } + if(backup_p) + free(backup_p); verbose(VERB_ALGO, "svcd callbacks end"); log_assert(sq->cblist == NULL); serviced_delete(sq); diff --git a/services/outside_network.h b/services/outside_network.h index 60cf8b8cb..2e521661c 100644 --- a/services/outside_network.h +++ b/services/outside_network.h @@ -65,12 +65,6 @@ struct outside_network { datagram at any time. */ ldns_buffer* udp_buff; - /** buffer for storage. (buffer for incoming connections, since - * either an event to outside or incoming happens, but not both - * This buffer is used during callbacks, so that the datagram - * that just arrived does not collide with new datagrams sent out. */ - ldns_buffer* udp_second; - /** * Array of udp comm point* that are used to listen to pending events. * Each is on a different port. This is for ip4 ports. @@ -271,16 +265,6 @@ struct outside_network* outside_network_create(struct comm_base* base, */ void outside_network_delete(struct outside_network* outnet); -/** - * Set secondary UDP buffer. Make sure it is not used during outside network - * callbacks. Such as the incoming network UDP buffer. Caller responsible - * for deletion. - * @param outnet: outside network. - * @param buf: buffer to use as secondary buffer. - */ -void outside_network_set_secondary_buffer(struct outside_network* outnet, - ldns_buffer* buf); - /** * Send UDP query, create pending answer. * Changes the ID for the query to be random and unique for that destination. diff --git a/testcode/fake_event.c b/testcode/fake_event.c index 00086e5af..75de4655a 100644 --- a/testcode/fake_event.c +++ b/testcode/fake_event.c @@ -692,13 +692,6 @@ outside_network_delete(struct outside_network* outnet) free(outnet); } -void -outside_network_set_secondary_buffer(struct outside_network* - ATTR_UNUSED(outnet), ldns_buffer* ATTR_UNUSED(buf)) -{ - /* nothing to do */ -} - struct pending* pending_udp_query(struct outside_network* outnet, ldns_buffer* packet, struct sockaddr_storage* addr, socklen_t addrlen, int timeout,