diff --git a/dap-sdk/net/stream/stream/dap_stream.c b/dap-sdk/net/stream/stream/dap_stream.c index 34cc1b870fc73139417608397faa518038aafc90..d244dbafbad17375161d9a03e581ffbf4e0f588b 100644 --- a/dap-sdk/net/stream/stream/dap_stream.c +++ b/dap-sdk/net/stream/stream/dap_stream.c @@ -697,12 +697,15 @@ void stream_dap_delete(dap_client_remote_t* sh, void * arg){ } pthread_mutex_unlock(&s_mutex_keepalive_list); - pthread_rwlock_wrlock(&l_stream->rwlock); - size_t i; - for(i=0;i<l_stream->channel_count; i++) - dap_stream_ch_delete(l_stream->channel[i]); - l_stream->channel_count = 0; + /* Until channel is closed, it may still need l_stream->rwlock, so we can't lock it here yet. + In case of races on stream closing think about making this place more robust; + or forbid locking l_stream->rwlock from inside of channels. */ + for( ;l_stream->channel_count; l_stream->channel_count--){ + dap_stream_ch_delete(l_stream->channel[l_stream->channel_count - 1]); + l_stream->channel[l_stream->channel_count - 1] = NULL; + } + pthread_rwlock_wrlock(&l_stream->rwlock); if(l_stream->session) dap_stream_session_close(l_stream->session->id); l_stream->session = NULL;