From 56456c1e0c829170da881747d356fbb818ed223f Mon Sep 17 00:00:00 2001 From: bol-van Date: Fri, 8 Aug 2025 11:35:13 +0300 Subject: [PATCH] nfqws,tpws: fix possible crashes or high memory usage if hostlist has duplicate hostnames --- docs/changes.txt | 4 ++++ nfq/pools.c | 13 ++++++++----- tpws/pools.c | 11 +++++++---- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index e1626c8..e73ad24 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -534,3 +534,7 @@ nfqws: ts fooling blockcheck: test ts fooling blockcheck: auto enable tcp timestamps in windows tpws,nfqws: special handling of IP-like hostnames. strip :port from hostname:port + +v71.4 + +nfqws,tpws: fix possible crashes or high memory usage if hostlist has duplicate hostnames diff --git a/nfq/pools.c b/nfq/pools.c index 351cd29..d41b94f 100644 --- a/nfq/pools.c +++ b/nfq/pools.c @@ -12,7 +12,7 @@ HASH_DEL(*ppool, elem); \ free(elem); \ } - + #define ADD_STR_POOL(etype, ppool, keystr, keystr_len) \ etype *elem; \ if (!(elem = (etype*)malloc(sizeof(etype)))) \ @@ -25,7 +25,7 @@ memcpy(elem->str, keystr, keystr_len); \ elem->str[keystr_len] = 0; \ oom = false; \ - HASH_ADD_KEYPTR(hh, *ppool, elem->str, strlen(elem->str), elem); \ + HASH_ADD_KEYPTR(hh, *ppool, elem->str, keystr_len, elem); \ if (oom) \ { \ free(elem->str); \ @@ -33,9 +33,12 @@ return false; \ } #define ADD_HOSTLIST_POOL(etype, ppool, keystr, keystr_len, flg) \ - ADD_STR_POOL(etype,ppool,keystr,keystr_len); \ - elem->flags = flg; - + etype *elem_find; \ + HASH_FIND(hh, *ppool, keystr, keystr_len, elem_find); \ + if (!elem_find) { \ + ADD_STR_POOL(etype,ppool,keystr,keystr_len); \ + elem->flags = flg; \ + } #undef uthash_nonfatal_oom #define uthash_nonfatal_oom(elt) ut_oom_recover(elt) diff --git a/tpws/pools.c b/tpws/pools.c index b856903..80063eb 100644 --- a/tpws/pools.c +++ b/tpws/pools.c @@ -25,7 +25,7 @@ memcpy(elem->str, keystr, keystr_len); \ elem->str[keystr_len] = 0; \ oom = false; \ - HASH_ADD_KEYPTR(hh, *ppool, elem->str, strlen(elem->str), elem); \ + HASH_ADD_KEYPTR(hh, *ppool, elem->str, keystr_len, elem); \ if (oom) \ { \ free(elem->str); \ @@ -33,9 +33,12 @@ return false; \ } #define ADD_HOSTLIST_POOL(etype, ppool, keystr, keystr_len, flg) \ - ADD_STR_POOL(etype,ppool,keystr,keystr_len); \ - elem->flags = flg; - + etype *elem_find; \ + HASH_FIND(hh, *ppool, keystr, keystr_len, elem_find); \ + if (!elem_find) { \ + ADD_STR_POOL(etype,ppool,keystr,keystr_len); \ + elem->flags = flg; \ + } #undef uthash_nonfatal_oom #define uthash_nonfatal_oom(elt) ut_oom_recover(elt)