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