No double use of buffers.

git-svn-id: file:///svn/unbound/trunk@552 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
Wouter Wijngaards 2007-08-28 08:03:45 +00:00
parent f9cc9481e2
commit f293924be8
5 changed files with 18 additions and 35 deletions

View file

@ -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,

View file

@ -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.

View file

@ -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);

View file

@ -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.

View file

@ -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,