From: Philip Homburg Date: Fri, 9 Jun 2023 11:59:31 +0000 (+0200) Subject: Fix for issue #887 (Timeouts to forward servers on BSD based system with ASLR) X-Git-Tag: release-1.18.0rc1~24^2~28^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F894%2Fhead;p=thirdparty%2Funbound.git Fix for issue #887 (Timeouts to forward servers on BSD based system with ASLR) and proabbly #516 (Stream reuse does not work on Windows) --- diff --git a/services/outside_network.c b/services/outside_network.c index 250440667..2a219cbc6 100644 --- a/services/outside_network.c +++ b/services/outside_network.c @@ -551,8 +551,27 @@ reuse_tcp_find(struct outside_network* outnet, struct sockaddr_storage* addr, log_assert(&key_p != ((struct reuse_tcp*)result)->pending); } /* not found, return null */ + + /* It is possible that we search for something before the first element + * in the tree. Replace a null pointer with the first element. + */ + if (!result) { + verbose(VERB_CLIENT, "reuse_tcp_find: taking first"); + result = rbtree_first(&outnet->tcp_reuse); + } + if(!result || result == RBTREE_NULL) return NULL; + + /* It is possible that we got the previous address, but that the + * address we are looking for is in the tree. If the address we got + * is less than the address we are looking, then take the next entry. + */ + if (reuse_cmp_addrportssl(result->key, &key_p.reuse) < 0) { + verbose(VERB_CLIENT, "reuse_tcp_find: key too low"); + result = rbtree_next(result); + } + verbose(VERB_CLIENT, "reuse_tcp_find check inexact match"); /* inexact match, find one of possibly several connections to the * same destination address, with the correct port, ssl, and