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,
+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.
outnet->num_tcp = num_tcp;
outnet->infra = infra;
outnet->rnd = rnd;
- outnet->udp_second = 0;
#ifndef INET6
do_ip6 = 0;
#endif
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)
{
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
* 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);
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.
*/
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.
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,