From 14378dbb0beaa16a7f300749744930cec95f2581 Mon Sep 17 00:00:00 2001
From: "Constantin P." <papizh.konstantin@demlabs.net>
Date: Thu, 13 Jun 2024 05:30:12 +0000
Subject: [PATCH] Hotfix 11886

---
 3rdparty/mman/mman.c                        | 164 --------------------
 3rdparty/mman/mman.h                        |  55 -------
 core/include/dap_common.h                   |   4 +
 crypto/CMakeLists.txt                       |  31 +++-
 crypto/src/dap_enc_key.c                    |   4 +
 crypto/test/crypto/dap_enc_benchmark_test.c |  26 ++--
 crypto/test/crypto/dap_enc_test.c           |   4 +
 net/stream/stream/dap_stream.c              |  27 +++-
 8 files changed, 73 insertions(+), 242 deletions(-)
 delete mode 100644 3rdparty/mman/mman.c
 delete mode 100644 3rdparty/mman/mman.h

diff --git a/3rdparty/mman/mman.c b/3rdparty/mman/mman.c
deleted file mode 100644
index 46ea905e6..000000000
--- a/3rdparty/mman/mman.c
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * mman-win32 library
- * https://code.google.com/p/mman-win32/
- * reinterpreted by Konstantin Papizh <konstantin.papizh@demlabs.net>
- * DeM Labs Inc.   https://demlabs.net
- */
-
-#include <windows.h>
-#include <errno.h>
-#include <stdio.h>
-#include "mman.h"
-
-static DWORD __map_mmap_prot_page(const int prot) {
-    volatile DWORD protect = PAGE_NOACCESS;
-    if ( prot == PROT_NONE )
-        return protect; // Prohibited for CFM, doomed to fail
-
-    protect <<= ( prot & PROT_READ );
-    if (prot & PROT_WRITE)
-        protect <<= ( prot & PROT_READ ) ? PROT_READ : ( PROT_READ|PROT_WRITE );
-    protect <<= ( prot & PROT_EXEC );
-    return protect;
-}
-
-static DWORD __map_mmap_prot_file(const int prot) {
-
-    DWORD desiredAccess = 0;
-    if (prot == PROT_NONE)
-        return desiredAccess;
-        
-    if (prot & PROT_READ)   desiredAccess |= FILE_MAP_READ;
-    if (prot & PROT_WRITE)  desiredAccess |= FILE_MAP_WRITE;
-    if (prot & PROT_EXEC)   desiredAccess |= FILE_MAP_EXECUTE;
-    return desiredAccess;
-}
-
-void* mmap(void *addr, size_t len, int prot, int flags, int fildes, offset_t off)
-{
-    HANDLE fm, h;
-    void *map = MAP_FAILED;
-
-    const DWORD dwFileOffsetLow = (sizeof(offset_t) <= sizeof(DWORD)) ?
-                    (DWORD)off : (DWORD)(off & 0xFFFFFFFFL);
-    const DWORD dwFileOffsetHigh = (sizeof(offset_t) <= sizeof(DWORD)) ?
-                    (DWORD)0 : (DWORD)((off >> 32) & 0xFFFFFFFF00000000L);
-    const DWORD protect = __map_mmap_prot_page(prot);
-    const DWORD desiredAccess = __map_mmap_prot_file(prot);
-
-    const offset_t maxSize = off + (offset_t)len;
-
-    const DWORD dwMaxSizeLow = (sizeof(offset_t) <= sizeof(DWORD)) ?
-                    (DWORD)maxSize : (DWORD)(maxSize & 0xFFFFFFFFL);
-    const DWORD dwMaxSizeHigh = (sizeof(offset_t) <= sizeof(DWORD)) ?
-                    (DWORD)0 : (DWORD)((maxSize >> 32) & 0xFFFFFFFF00000000L);
-    _set_errno(0);
-    
-    if (len == 0 || prot == PROT_EXEC) {
-        _set_errno(EINVAL);
-        return MAP_FAILED;
-    }
-    
-    h = ((flags & MAP_ANONYMOUS) == 0) ? 
-                    (HANDLE)_get_osfhandle(fildes) : INVALID_HANDLE_VALUE;
-
-    if ((flags & MAP_ANONYMOUS) == 0 && h == INVALID_HANDLE_VALUE) {
-        _set_errno(EBADF);
-        return MAP_FAILED;
-    }
-
-    fm = CreateFileMapping(h, NULL, protect, dwMaxSizeHigh, dwMaxSizeLow, NULL);
-
-    if (fm == NULL) {
-        int a = errno;
-        _set_errno(GetLastError());
-        a = errno;
-        printf("%d", a);
-        return MAP_FAILED;
-    }
-  
-    if ((flags & MAP_FIXED) == 0) {
-        map = MapViewOfFile(fm, desiredAccess, dwFileOffsetHigh, dwFileOffsetLow, len);
-    }
-    else {
-        map = MapViewOfFileEx(fm, desiredAccess, dwFileOffsetHigh, dwFileOffsetLow, len, addr);
-    }
-    CloseHandle(fm);
-
-    if (map == NULL) {
-        _set_errno(GetLastError());
-        return MAP_FAILED;
-    }
-    return map;
-}
-
-int munmap(void *addr, size_t len) {
-    if (UnmapViewOfFile(addr))
-        return 0;
-        
-    _set_errno(GetLastError());
-    return -1;
-}
-
-int _mprotect(void *addr, size_t len, int prot) {
-    DWORD newProtect = __map_mmap_prot_page(prot);
-    DWORD oldProtect = 0;
-    
-    if (VirtualProtect(addr, len, newProtect, &oldProtect))
-        return 0;
-    _set_errno(GetLastError());
-    return -1;
-}
-
-int msync(void *addr, size_t len, int flags) {
-    if (FlushViewOfFile(addr, len))
-        return 0;
-    _set_errno(GetLastError());
-    return -1;
-}
-
-int mlock(const void *addr, size_t len) {
-    if (VirtualLock((LPVOID)addr, len))
-        return 0;
-    _set_errno(GetLastError());
-    return -1;
-}
-
-int munlock(const void *addr, size_t len) {
-    if (VirtualUnlock((LPVOID)addr, len))
-        return 0;
-    _set_errno(GetLastError());
-    return -1;
-}
-
-ssize_t pread(int fd, void *buf, unsigned long count, offset_t offset) {
-    unsigned long len = 0;
-
-    OVERLAPPED overlapped;
-    memset(&overlapped, 0, sizeof(OVERLAPPED));
-    overlapped.OffsetHigh = (uint32_t)((offset & 0xFFFFFFFF00000000LL) >> 32);
-    overlapped.Offset = (uint32_t)(offset & 0xFFFFFFFFLL);
-
-    HANDLE file = (HANDLE)_get_osfhandle(fd);
-    if ((!ReadFile(file, buf, count, &len, &overlapped)) && GetLastError() != ERROR_HANDLE_EOF) {
-        _set_errno(GetLastError());
-        return -1;
-    }
-    return len;
-}
-
-ssize_t pwrite(int fd, const void *buf, unsigned long count, offset_t offset) {
-    long unsigned int len = 0;
-
-    OVERLAPPED overlapped;
-    memset(&overlapped, 0, sizeof(OVERLAPPED));
-    overlapped.OffsetHigh = (uint32_t)((offset & 0xFFFFFFFF00000000LL) >> 32);
-    overlapped.Offset = (uint32_t)(offset & 0xFFFFFFFFLL);
-
-    HANDLE file = (HANDLE)_get_osfhandle(fd);
-    if (!WriteFile(file, buf, count, &len, &overlapped)) {
-        _set_errno(GetLastError());
-        return -1;
-    }
-    return len;
-}
diff --git a/3rdparty/mman/mman.h b/3rdparty/mman/mman.h
deleted file mode 100644
index 7367f3d4c..000000000
--- a/3rdparty/mman/mman.h
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef _MMAN_H_
-#define _MMAN_H_
-
-#include <_mingw.h>
-#include <stdint.h>
-#include <io.h>
-
-#if defined(_WIN64)
-typedef int64_t offset_t;
-#else
-typedef uint32_t offset_t;
-#endif
-
-#include <sys/types.h>
-#include <stdbool.h>
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define PROT_NONE       0
-#define PROT_READ       1
-#define PROT_WRITE      2
-#define PROT_EXEC       4
-
-#define MAP_FILE        0
-#define MAP_SHARED      1
-#define MAP_PRIVATE     2
-#define MAP_TYPE        0xf
-#define MAP_FIXED       0x10
-#define MAP_ANONYMOUS   0x20
-#define MAP_ANON        MAP_ANONYMOUS
-
-#define MAP_FAILED      ((void *)-1)
-
-#define MS_ASYNC        1
-#define MS_SYNC         2
-#define MS_INVALIDATE   4
-
-#define fdatasync(fd) _commit(fd)
-
-void*   mmap(void *addr, size_t len, int prot, int flags, int fildes, offset_t offset);
-int     munmap(void *addr, size_t len);
-int     _mprotect(void *addr, size_t len, int prot);
-int     msync(void *addr, size_t len, int flags);
-int     mlock(const void *addr, size_t len);
-int     munlock(const void *addr, size_t len);
-
-ssize_t pread(int fd, void *buf, unsigned long count, offset_t offset);
-ssize_t pwrite(int fd, const void *buf, unsigned long count, offset_t offset);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*  _MMAN_H_ */
diff --git a/core/include/dap_common.h b/core/include/dap_common.h
index d1a42fb66..07e5e01c9 100755
--- a/core/include/dap_common.h
+++ b/core/include/dap_common.h
@@ -299,6 +299,10 @@ DAP_STATIC_INLINE uint64_t dap_page_rounddown(uint64_t a) {
 }
 
 #ifdef DAP_OS_WINDOWS
+#define SIZE_64KB ( 1 << 16 )
+DAP_STATIC_INLINE uint64_t dap_64k_rounddown(uint64_t a) {
+    return a & ( ~(SIZE_64KB - 1) ); 
+}
 typedef struct iovec {
     void    *iov_base; /* Data */
     size_t  iov_len; /* ... and its' size */
diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt
index d4c974348..4d408e91b 100755
--- a/crypto/CMakeLists.txt
+++ b/crypto/CMakeLists.txt
@@ -119,7 +119,6 @@ file( GLOB CRYPTO_SRCS
       src/sig_tesla/*.c
       src/sig_picnic/*.c
       src/sig_dilithium/*.c
-	  src/sig_ecdsa/*.c
       src/sig_shipovnik/*.c
       src/sig_shipovnik/streebog/*.c
       src/ringct20/*.c
@@ -128,6 +127,13 @@ file( GLOB CRYPTO_SRCS
       ${SPHINCS_SRCS}
 ) 
 
+if (BUILD_WITH_TPS_TEST)
+    file (GLOB ECDSA_SRC src/sig_ecdsa/*.c)
+    set (CRYPTO_SRCS ${CRYPTO_SRCS} ${ECDSA_SRC})
+else()
+    list (FILTER CRYPTO_SRCS EXCLUDE REGEX ".*ecdsa.c")
+endif()
+
 get_filename_component(full_path_src ${CMAKE_CURRENT_SOURCE_DIR}/src/sig_shipovnik/streebog/gost3411-2012.c ABSOLUTE)
 list(REMOVE_ITEM CRYPTO_SRCS "${full_path_src}")
 
@@ -144,7 +150,6 @@ file( GLOB CRYPTO_HEADERS
       src/msrln/*.h
       src/newhope/*.h
       src/sig_bliss/*.h
-      src/sig_ecdsa/*.h
       src/sig_shipovnik/*.h
       src/sig_shipovnik/streebog/*.h
       src/sig_tesla/*.h
@@ -156,6 +161,12 @@ file( GLOB CRYPTO_HEADERS
       ${SPHINCS_HEADERS}
       include/*.h
 )
+if (BUILD_WITH_TPS_TEST)
+    file (GLOB ECDSA_HDR src/sig_ecdsa/*.h)
+    set (CRYPTO_HEADERS ${CRYPTO_HEADERS} ${ECDSA_HDR})
+else()
+    list (FILTER CRYPTO_HEADERS EXCLUDE REGEX ".*ecdsa.h")
+endif()
 
 set_source_files_properties(src/sig_picnic/picnic_impl.c PROPERTIES COMPILE_FLAGS -Wno-stringop-overflow)
 if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 12.2)
@@ -173,7 +184,9 @@ file( GLOB XKCP_SRCS
 
 set( CRYPTO_INCLUDE_PRIVATE src/seed src/rand src/iaes src/oaes src/sha3 src/msrln src/sig_bliss src/sig_tesla src/sig_picnic src/sig_dilithium src/falcon src/sig_shipovnik src/sig_shipovnik/streebog src/sphincsplus src include)
 add_subdirectory (src/Kyber/crypto_kem/kyber512/optimized/)
-add_subdirectory (${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/secp256k1/ ${CMAKE_CURRENT_BINARY_DIR}/secp256k1)
+if (BUILD_WITH_TPS_TEST)
+    add_subdirectory (${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/secp256k1/ ${CMAKE_CURRENT_BINARY_DIR}/secp256k1)
+endif()
 
 option (DAP_PQLR "PQRL Intergration" OFF)
 
@@ -432,16 +445,20 @@ endif()
 
 target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/json-c)
 
-target_link_libraries(dap_crypto dap_core dap_crypto_kyber512 dap_json-c secp256k1)
+target_link_libraries(dap_crypto dap_core dap_crypto_kyber512 dap_json-c)
+if (BUILD_WITH_TPS_TEST)
+    target_link_libraries(dap_crypto secp256k1)
+endif()
 
 if(UNIX)
   target_link_libraries(dap_crypto m)
 endif()
 
 target_include_directories(dap_crypto PUBLIC ../3rdparty/shishua)
-target_include_directories(dap_crypto PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/secp256k1/include)
-target_include_directories(dap_crypto PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/secp256k1/src)
-
+if (BUILD_WITH_TPS_TEST)
+    target_include_directories(dap_crypto PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/secp256k1/include)
+    target_include_directories(dap_crypto PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/secp256k1/src)
+endif()
 
 if(BUILD_CRYPTO_TESTS)
     enable_testing()
diff --git a/crypto/src/dap_enc_key.c b/crypto/src/dap_enc_key.c
index 96ffe2992..0edfbe839 100755
--- a/crypto/src/dap_enc_key.c
+++ b/crypto/src/dap_enc_key.c
@@ -40,7 +40,9 @@
 #include "dap_enc_kyber.h"
 #include "dap_enc_sphincsplus.h"
 #include "dap_enc_multisign.h"
+#ifdef DAP_TPS_TEST
 #include "dap_enc_ecdsa.h"
+#endif
 #include "dap_enc_shipovnik.h"
 #include "dap_enc_ringct20.h"
 #ifdef DAP_PQRL
@@ -368,6 +370,7 @@ dap_enc_key_callbacks_t s_callbacks[]={
 
   [DAP_ENC_KEY_TYPE_SIG_ECDSA]={
         .name =                             "SIG_ECDSA",
+#ifdef DAP_TPS_TEST
         .enc =                              NULL,
         .dec =                              NULL,
         .enc_na =                           NULL,
@@ -399,6 +402,7 @@ dap_enc_key_callbacks_t s_callbacks[]={
         .deser_priv_key_size =              dap_enc_sig_ecdsa_deser_key_size,
         .deser_pub_key_size =               dap_enc_sig_ecdsa_deser_pkey_size,
         .deser_sign_size  =                 dap_enc_sig_ecdsa_signature_size
+#endif
     },
 
 
diff --git a/crypto/test/crypto/dap_enc_benchmark_test.c b/crypto/test/crypto/dap_enc_benchmark_test.c
index f81716bc9..ee17257ac 100644
--- a/crypto/test/crypto/dap_enc_benchmark_test.c
+++ b/crypto/test/crypto/dap_enc_benchmark_test.c
@@ -5,18 +5,20 @@
 #include "rand/dap_rand.h"
 #define LOG_TAG "dap_crypto_benchmark_tests"
 
-#define SIGNATURE_TYPE_COUNT 7
+//#define SIGNATURE_TYPE_COUNT 7
 #define SIGN_COUNT 5
 #define KEYS_TOTAL_COUNT 10
 
-dap_enc_key_type_t s_key_type_arr[SIGNATURE_TYPE_COUNT] = {\
-        DAP_ENC_KEY_TYPE_SIG_TESLA,\
-        DAP_ENC_KEY_TYPE_SIG_BLISS,\
-        DAP_ENC_KEY_TYPE_SIG_DILITHIUM,\
+dap_enc_key_type_t s_key_type_arr[] = {
+        DAP_ENC_KEY_TYPE_SIG_TESLA,
+        DAP_ENC_KEY_TYPE_SIG_BLISS,
+        DAP_ENC_KEY_TYPE_SIG_DILITHIUM,
         // DAP_ENC_KEY_TYPE_SIG_PICNIC,
-        DAP_ENC_KEY_TYPE_SIG_FALCON,\
-        DAP_ENC_KEY_TYPE_SIG_SPHINCSPLUS,\
-        DAP_ENC_KEY_TYPE_SIG_ECDSA, \
+        DAP_ENC_KEY_TYPE_SIG_FALCON,
+        DAP_ENC_KEY_TYPE_SIG_SPHINCSPLUS,
+#ifdef DAP_TPS_TEST
+        DAP_ENC_KEY_TYPE_SIG_ECDSA,
+#endif
         DAP_ENC_KEY_TYPE_SIG_SHIPOVNIK };
 
 /*--------------------------TRANSFER TEST BLOCK--------------------------*/
@@ -108,12 +110,13 @@ static int s_sign_verify_test(dap_enc_key_type_t a_key_type, int a_times, int *a
 
     int l_t1 = 0;
     *a_sig_time = 0;
+    int l_sig_type_count = sizeof(s_key_type_arr) / sizeof(*s_key_type_arr);
     for (int i = 0; i < a_times; ++i) {
         randombytes(seed, seed_size);
         // used only in multisign
         dap_enc_key_type_t l_key[KEYS_TOTAL_COUNT];
         for (int j = 0; j < KEYS_TOTAL_COUNT; j++) {
-            int l_step = random_uint32_t( SIGNATURE_TYPE_COUNT);
+            int l_step = random_uint32_t(l_sig_type_count);
             l_key[j] = s_key_type_arr[l_step];
         }
         // ----------
@@ -176,13 +179,14 @@ static int s_sign_verify_ser_test(dap_enc_key_type_t a_key_type, int a_times, in
 
     int l_t1 = 0;
     *a_sig_time = 0;
+    int l_sig_type_count = sizeof(s_key_type_arr) / sizeof(*s_key_type_arr);
     for (int i = 0; i < a_times; ++i) {
         randombytes(seed, seed_size);
 
         // used only in multisign
         dap_enc_key_type_t l_key[KEYS_TOTAL_COUNT];
         for (int j = 0; j < KEYS_TOTAL_COUNT; j++) {
-            int l_step = random_uint32_t( SIGNATURE_TYPE_COUNT);
+            int l_step = random_uint32_t(l_sig_type_count);
             l_key[j] = s_key_type_arr[l_step];
         }
         // ----------
@@ -272,7 +276,9 @@ static int s_sign_verify_tests_run(int a_times)
     l_ret |= s_sign_verify_test_becnhmark("DILITHIUM", DAP_ENC_KEY_TYPE_SIG_DILITHIUM, a_times);
     l_ret |= s_sign_verify_test_becnhmark("FALCON", DAP_ENC_KEY_TYPE_SIG_FALCON, a_times);
     l_ret |= s_sign_verify_test_becnhmark("SPHINCSPLUS", DAP_ENC_KEY_TYPE_SIG_SPHINCSPLUS, a_times);
+#ifdef DAP_TPS_TEST
     l_ret |= s_sign_verify_test_becnhmark("ECDSA", DAP_ENC_KEY_TYPE_SIG_ECDSA, a_times);
+#endif
     l_ret |= s_sign_verify_test_becnhmark("SHIPOVNIK", DAP_ENC_KEY_TYPE_SIG_SHIPOVNIK, a_times);
     l_ret |= s_sign_verify_test_becnhmark("MULTISIGN", DAP_ENC_KEY_TYPE_SIG_MULTI_CHAINED, a_times);
     dap_cleanup_test_case();
diff --git a/crypto/test/crypto/dap_enc_test.c b/crypto/test/crypto/dap_enc_test.c
index a256ff44e..fa9a9433c 100755
--- a/crypto/test/crypto/dap_enc_test.c
+++ b/crypto/test/crypto/dap_enc_test.c
@@ -420,8 +420,10 @@ void dap_enc_tests_run() {
     test_serialize_deserialize(DAP_ENC_KEY_TYPE_SIG_FALCON, false);
     dap_print_module_name("dap_enc serialize->deserialize SPHINCSPLUS");
     test_serialize_deserialize(DAP_ENC_KEY_TYPE_SIG_SPHINCSPLUS, false);
+#ifdef DAP_TPS_TEST
     dap_print_module_name("dap_enc serialize->deserialize ECDSA");
     test_serialize_deserialize(DAP_ENC_KEY_TYPE_SIG_ECDSA, false);
+#endif
     dap_print_module_name("dap_enc serialize->deserialize IAES");
     test_serialize_deserialize(DAP_ENC_KEY_TYPE_IAES, true);
     dap_print_module_name("dap_enc serialize->deserialize SHIPOVNIK");
@@ -441,8 +443,10 @@ void dap_enc_tests_run() {
     test_serialize_deserialize_pub_priv(DAP_ENC_KEY_TYPE_SIG_FALCON);
     dap_print_module_name("dap_enc_sig serialize->deserialize SPHINCSPLUS");
     test_serialize_deserialize_pub_priv(DAP_ENC_KEY_TYPE_SIG_SPHINCSPLUS);
+#ifdef DAP_TPS_TEST
     dap_print_module_name("dap_enc_sig serialize->deserialize ECDSA");
     test_serialize_deserialize_pub_priv(DAP_ENC_KEY_TYPE_SIG_ECDSA);
+#endif
     dap_print_module_name("dap_enc_sig serialize->deserialize SHIPOVNIK");
     test_serialize_deserialize_pub_priv(DAP_ENC_KEY_TYPE_SIG_SHIPOVNIK);
     dap_cleanup_test_case();
diff --git a/net/stream/stream/dap_stream.c b/net/stream/stream/dap_stream.c
index 18a6e465f..2d8c24f44 100644
--- a/net/stream/stream/dap_stream.c
+++ b/net/stream/stream/dap_stream.c
@@ -1008,7 +1008,10 @@ int s_stream_add_to_hashtable(dap_stream_t *a_stream)
 void s_stream_delete_from_list(dap_stream_t *a_stream)
 {
     dap_return_if_fail(a_stream);
-    assert(pthread_rwlock_wrlock(&s_streams_lock) != EDEADLOCK);
+    if ( pthread_rwlock_wrlock(&s_streams_lock) == EDEADLK ) {
+        log_it(L_CRITICAL, "! Attempt to aquire streams lock recursively !");
+        return;
+    }
     dap_stream_t *l_stream = NULL;
     if (a_stream->prev)
         DL_DELETE(s_streams, a_stream);
@@ -1034,7 +1037,10 @@ int dap_stream_add_to_list(dap_stream_t *a_stream)
 {
     dap_return_val_if_fail(a_stream, -1);
     int l_ret = 0;
-    assert(pthread_rwlock_wrlock(&s_streams_lock) != EDEADLOCK);
+    if ( pthread_rwlock_wrlock(&s_streams_lock) == EDEADLK ) {
+        log_it(L_CRITICAL, "! Attempt to aquire streams lock recursively !");
+        return -666;
+    }
     DL_APPEND(s_streams, a_stream);
     if (a_stream->authorized)
         l_ret = s_stream_add_to_hashtable(a_stream);
@@ -1053,7 +1059,10 @@ dap_events_socket_uuid_t dap_stream_find_by_addr(dap_stream_node_addr_t *a_addr,
     dap_return_val_if_fail(a_addr && a_addr->uint64, 0);
     dap_stream_t *l_auth_stream = NULL;
     dap_events_socket_uuid_t l_ret = 0;
-    assert(!pthread_rwlock_rdlock(&s_streams_lock));
+    if ( pthread_rwlock_wrlock(&s_streams_lock) == EDEADLK ) {
+        log_it(L_CRITICAL, "! Attempt to aquire streams lock recursively !");
+        return 0;
+    }
     HASH_FIND(hh, s_authorized_streams, a_addr, sizeof(*a_addr), l_auth_stream);
     if (l_auth_stream) {
         if (a_worker)
@@ -1061,7 +1070,7 @@ dap_events_socket_uuid_t dap_stream_find_by_addr(dap_stream_node_addr_t *a_addr,
         l_ret = l_auth_stream->esocket_uuid;
     } else if (a_worker)
         *a_worker = NULL;
-    assert(!pthread_rwlock_unlock(&s_streams_lock));
+    pthread_rwlock_unlock(&s_streams_lock);
     return l_ret;
 }
 
@@ -1071,7 +1080,10 @@ dap_list_t *dap_stream_find_all_by_addr(dap_stream_node_addr_t *a_addr)
     dap_return_val_if_fail(a_addr, l_ret);
     dap_stream_t *l_stream;
 
-    assert(pthread_rwlock_rdlock(&s_streams_lock) != EDEADLOCK);
+    if ( pthread_rwlock_wrlock(&s_streams_lock) == EDEADLK ) {
+        log_it(L_CRITICAL, "! Attempt to aquire streams lock recursively !");
+        return NULL;
+    }
     DL_FOREACH(s_streams, l_stream) {
         if (!l_stream->authorized || a_addr->uint64 != l_stream->node.uint64)
             continue;
@@ -1147,7 +1159,10 @@ static void s_stream_fill_info(dap_stream_t *a_stream, dap_stream_info_t *a_out_
 dap_stream_info_t *dap_stream_get_links_info(dap_cluster_t *a_cluster, size_t *a_count)
 {
     dap_return_val_if_pass(!a_cluster && !s_streams, NULL);
-    assert(pthread_rwlock_rdlock(&s_streams_lock) != EDEADLOCK);
+    if ( pthread_rwlock_wrlock(&s_streams_lock) == EDEADLK ) {
+        log_it(L_CRITICAL, "! Attempt to aquire streams lock recursively !");
+        return NULL;
+    }
     dap_stream_t *it;
     size_t l_streams_count = 0, i = 0;
     if (a_cluster) {
-- 
GitLab