]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
- Better fix for reuse tree comparison for is-tls sockets. Where
authorW.C.A. Wijngaards <wouter@nlnetlabs.nl>
Wed, 25 Nov 2020 09:22:11 +0000 (10:22 +0100)
committerW.C.A. Wijngaards <wouter@nlnetlabs.nl>
Wed, 25 Nov 2020 09:22:11 +0000 (10:22 +0100)
  the tree key identity is preserved after cleanup of the TLS state.

doc/Changelog
services/outside_network.c
services/outside_network.h

index 0ceba16b4d582799c51224804bc3c4fb3107d6d2..646c7f6fe901d4c4d666368a45b846d9c569c03c 100644 (file)
@@ -1,6 +1,8 @@
 25 November 2020: Wouter
        - with udp-connect ignore connection refused with UDP timeouts.
        - Fix udp-connect on FreeBSD, do send calls on connected UDP socket.
+       - Better fix for reuse tree comparison for is-tls sockets.  Where
+         the tree key identity is preserved after cleanup of the TLS state.
 
 24 November 2020: Wouter
        - Merge PR #283 : Stream reuse.  This implements upstream stream
index 7245506326eeefc86ccc3e469544a48259cd4362..0a940aaf26632b8fec276a554cea0e73f57525c7 100644 (file)
@@ -146,9 +146,9 @@ reuse_cmp_addrportssl(const void* key1, const void* key2)
                return r;
 
        /* compare if SSL-enabled */
-       if(r1->pending->c->ssl && !r2->pending->c->ssl)
+       if(r1->is_ssl && !r2->is_ssl)
                return 1;
-       if(!r1->pending->c->ssl && r2->pending->c->ssl)
+       if(!r1->is_ssl && r2->is_ssl)
                return -1;
        return 0;
 }
@@ -465,8 +465,8 @@ reuse_tcp_find(struct outside_network* outnet, struct sockaddr_storage* addr,
        key_p.c = &c;
        key_p.reuse.pending = &key_p;
        key_p.reuse.node.key = &key_p.reuse;
-       if(use_ssl) /* something nonNULL for comparisons in tree */
-               key_p.c->ssl = (void*)1;
+       if(use_ssl)
+               key_p.reuse.is_ssl = 1;
        if(addrlen > sizeof(key_p.reuse.addr))
                return NULL;
        memmove(&key_p.reuse.addr, addr, addrlen);
@@ -657,6 +657,9 @@ outnet_tcp_take_into_use(struct waiting_tcp* w)
        pend->c->repinfo.addrlen = w->addrlen;
        memcpy(&pend->c->repinfo.addr, &w->addr, w->addrlen);
        pend->reuse.pending = pend;
+       if(pend->c->ssl)
+               pend->reuse.is_ssl = 1;
+       else    pend->reuse.is_ssl = 0;
        /* insert in reuse by address tree if not already inserted there */
        (void)reuse_tcp_insert(w->outnet, pend);
        reuse_tree_by_id_insert(&pend->reuse, w);
index 7dade240bfabd987d2dcef405114f643b04f65be..48f9d3f032c4d3a693622e3036cff639b1b1adec 100644 (file)
@@ -247,6 +247,8 @@ struct reuse_tcp {
        struct sockaddr_storage addr;
        /** length of addr */
        socklen_t addrlen;
+       /** also key for tcp_reuse tree, if ssl is used */
+       int is_ssl;
        /** lru chain, so that the oldest can be removed to get a new
         * connection when all are in (re)use. oldest is last in list.
         * The lru only contains empty connections waiting for reuse,