From b760b2665e99241eb70bc057cd333309bcb29fe6 Mon Sep 17 00:00:00 2001
From: "Constantin P." <papizh.konstantin@demlabs.net>
Date: Tue, 15 Oct 2024 14:34:52 +0700
Subject: [PATCH] Asserts set to capture stream access recursion

---
 net/stream/stream/dap_stream.c | 46 ++++++++++++++++++----------------
 1 file changed, 25 insertions(+), 21 deletions(-)

diff --git a/net/stream/stream/dap_stream.c b/net/stream/stream/dap_stream.c
index 77c1a62f7..085d40a52 100644
--- a/net/stream/stream/dap_stream.c
+++ b/net/stream/stream/dap_stream.c
@@ -960,10 +960,11 @@ 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);
-    if ( pthread_rwlock_wrlock(&s_streams_lock) == EDEADLK ) {
-        log_it(L_CRITICAL, "! Attempt to aquire streams lock recursively !");
-        return;
-    }
+    int lock = pthread_rwlock_wrlock(&s_streams_lock);
+    assert(lock != EDEADLK);
+    if ( lock == EDEADLK )
+        return log_it(L_CRITICAL, "! Attempt to aquire streams lock recursively !");
+
     dap_stream_t *l_stream = NULL;
     if (a_stream->prev)
         DL_DELETE(s_streams, a_stream);
@@ -989,10 +990,10 @@ int dap_stream_add_to_list(dap_stream_t *a_stream)
 {
     dap_return_val_if_fail(a_stream, -1);
     int l_ret = 0;
-    if ( pthread_rwlock_wrlock(&s_streams_lock) == EDEADLK ) {
-        log_it(L_CRITICAL, "! Attempt to aquire streams lock recursively !");
-        return -666;
-    }
+    int lock = pthread_rwlock_wrlock(&s_streams_lock);
+    assert(lock != EDEADLK);
+    if ( lock == EDEADLK )
+        return log_it(L_CRITICAL, "! Attempt to aquire streams lock recursively !"), -666;
     DL_APPEND(s_streams, a_stream);
     if (a_stream->authorized)
         l_ret = s_stream_add_to_hashtable(a_stream);
@@ -1011,10 +1012,11 @@ 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;
-    if ( pthread_rwlock_rdlock(&s_streams_lock) == EDEADLK ) {
-        log_it(L_CRITICAL, "! Attempt to aquire streams lock recursively !");
-        return 0;
-    }
+    int lock = pthread_rwlock_rdlock(&s_streams_lock);
+    assert(lock != EDEADLK);
+    if ( lock == EDEADLK )
+        return log_it(L_CRITICAL, "! Attempt to aquire streams lock recursively !"), 0;
+
     HASH_FIND(hh, s_authorized_streams, a_addr, sizeof(*a_addr), l_auth_stream);
     if (l_auth_stream) {
         if (a_worker)
@@ -1032,10 +1034,11 @@ 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;
 
-    if ( pthread_rwlock_rdlock(&s_streams_lock) == EDEADLK ) {
-        log_it(L_CRITICAL, "! Attempt to aquire streams lock recursively !");
-        return NULL;
-    }
+    int lock = pthread_rwlock_rdlock(&s_streams_lock);
+    assert(lock != EDEADLK);
+    if ( lock == EDEADLK )
+        return log_it(L_CRITICAL, "! Attempt to aquire streams lock recursively !"), NULL;
+
     DL_FOREACH(s_streams, l_stream) {
         if (!l_stream->authorized || a_addr->uint64 != l_stream->node.uint64)
             continue;
@@ -1111,10 +1114,11 @@ 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);
-    if ( pthread_rwlock_rdlock(&s_streams_lock) == EDEADLK ) {
-        log_it(L_CRITICAL, "! Attempt to aquire streams lock recursively !");
-        return NULL;
-    }
+    int lock = pthread_rwlock_rdlock(&s_streams_lock);
+    assert(lock != EDEADLK);
+    if ( lock == EDEADLK )
+        return log_it(L_CRITICAL, "! Attempt to aquire streams lock recursively !"), NULL;
+
     dap_stream_t *it = NULL;
     size_t l_streams_count = 0, i = 0;
     if (a_cluster) {
@@ -1128,7 +1132,7 @@ dap_stream_info_t *dap_stream_get_links_info(dap_cluster_t *a_cluster, size_t *a
         pthread_rwlock_unlock(&s_streams_lock);
         return NULL;
     }
-    dap_stream_info_t *l_ret = DAP_NEW_Z_SIZE(dap_stream_info_t, sizeof(dap_stream_info_t) * l_streams_count);
+    dap_stream_info_t *l_ret = DAP_NEW_Z_COUNT(dap_stream_info_t, l_streams_count);
     if (!l_ret) {
         log_it(L_CRITICAL, "%s", c_error_memory_alloc);
         if (a_cluster)
-- 
GitLab