]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
No double use of buffers.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Tue, 28 Aug 2007 08:03:45 +0000 (08:03 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Tue, 28 Aug 2007 08:03:45 +0000 (08:03 +0000)
git-svn-id: file:///svn/unbound/trunk@552 be551aaa-1e26-0410-a405-d3ace91eadb9

daemon/worker.c
doc/Changelog
services/outside_network.c
services/outside_network.h
testcode/fake_event.c

index 2897540e74f5bc396cc17667081fcb122e749566..b7bcb0a45b0d6e3a594223c3c738e8bd18e9bf37 100644 (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, 
index 5a6fd4eb64d0946387777d26fce762cbd4367a9e..4e497d38d9795c79108b3ef5f21d9bc2f6e543d9 100644 (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.
index 6a4729638b842133d27d8cd01e763f95cb73b6d4..14c969dca8c4cb1202ca37c1000e9757eb1ccd13 100644 (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);
index 60cf8b8cb5f66930e3104b0877b21f2cdb69288e..2e521661c8075c3b74a82304eeec0d38a309a0ce 100644 (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.
index 00086e5af138839d4dc2c99c3aa99447ee68e264..75de4655ac8c3f2c36e65dbe1adb47b5bde8183e 100644 (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,