From 9b25720b61043ad97efeadf44d5daf117d5d48be Mon Sep 17 00:00:00 2001 From: Sudeep Mohanty Date: Fri, 11 Oct 2024 11:49:50 +0200 Subject: [PATCH] fix(freertos): Fixed SMP race condition in stream_buffers.c This commit fixes a race condition in dual-core SMP mode where in the xStreamBufferReceive() makes the xTaskWaitingToReceive NULL but it may have already been evaluated to not be NULL by xStreamBufferSend() running on another core and eventually leading to a crash in tasks.c. --- .../freertos/FreeRTOS-Kernel/stream_buffer.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/components/freertos/FreeRTOS-Kernel/stream_buffer.c b/components/freertos/FreeRTOS-Kernel/stream_buffer.c index d67f091cba..e9c2cfbdcf 100644 --- a/components/freertos/FreeRTOS-Kernel/stream_buffer.c +++ b/components/freertos/FreeRTOS-Kernel/stream_buffer.c @@ -855,7 +855,19 @@ size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, /* Wait for data to be available. */ traceBLOCKING_ON_STREAM_BUFFER_RECEIVE( xStreamBuffer ); ( void ) xTaskNotifyWait( ( uint32_t ) 0, ( uint32_t ) 0, NULL, xTicksToWait ); - pxStreamBuffer->xTaskWaitingToReceive = NULL; + + /* In SMP mode, the task may have been woken and scheduled on + * another core. Hence, we must clear the xTaskWaitingToReceive + * handle in a critical section. */ + #if ( configNUM_CORES > 1 ) + taskENTER_CRITICAL( &( pxStreamBuffer->xStreamBufferLock ) ); + #endif /* configNUMBER_OF_CORES > 1 */ + { + pxStreamBuffer->xTaskWaitingToReceive = NULL; + } + #if ( configNUM_CORES > 1 ) + taskEXIT_CRITICAL( &( pxStreamBuffer->xStreamBufferLock ) ); + #endif /* configNUMBER_OF_CORES > 1 */ /* Recheck the data available after blocking. */ xBytesAvailable = prvBytesInBuffer( pxStreamBuffer );