Skip to content

Commit 910d17a

Browse files
fix(freertos): Limit idle task name length copy operation
This commit limits the idle task name length copy operation to prevent Out-of-bounds memory access warnings from static code analyzers. Signed-off-by: Sudeep Mohanty <sudeep.mohanty@espressif.com>
1 parent 974351f commit 910d17a

File tree

1 file changed

+17
-30
lines changed

1 file changed

+17
-30
lines changed

tasks.c

Lines changed: 17 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
/* Standard includes. */
3030
#include <stdlib.h>
3131
#include <string.h>
32+
#include <stdio.h>
3233

3334
/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining
3435
* all the API functions to use the MPU wrappers. That should only be done when
@@ -3521,26 +3522,12 @@ static BaseType_t prvCreateIdleTasks( void )
35213522
{
35223523
BaseType_t xReturn = pdPASS;
35233524
BaseType_t xCoreID;
3524-
char cIdleName[ configMAX_TASK_NAME_LEN ];
3525+
char cIdleName[ configMAX_TASK_NAME_LEN ] = { 0 };
35253526
TaskFunction_t pxIdleTaskFunction = NULL;
3526-
BaseType_t xIdleTaskNameIndex;
35273527

3528-
for( xIdleTaskNameIndex = ( BaseType_t ) 0; xIdleTaskNameIndex < ( BaseType_t ) configMAX_TASK_NAME_LEN; xIdleTaskNameIndex++ )
3529-
{
3530-
cIdleName[ xIdleTaskNameIndex ] = configIDLE_TASK_NAME[ xIdleTaskNameIndex ];
3531-
3532-
/* Don't copy all configMAX_TASK_NAME_LEN if the string is shorter than
3533-
* configMAX_TASK_NAME_LEN characters just in case the memory after the
3534-
* string is not accessible (extremely unlikely). */
3535-
if( cIdleName[ xIdleTaskNameIndex ] == ( char ) 0x00 )
3536-
{
3537-
break;
3538-
}
3539-
else
3540-
{
3541-
mtCOVERAGE_TEST_MARKER();
3542-
}
3543-
}
3528+
/* Copy the name of the idle task up to configMAX_TASK_NAME_LEN - 1 characters, leaving room for the null-terminator */
3529+
strncpy( cIdleName, configIDLE_TASK_NAME, configMAX_TASK_NAME_LEN - 1 );
3530+
cIdleName[ configMAX_TASK_NAME_LEN - 1 ] = '\0';
35443531

35453532
/* Add each idle task at the lowest priority. */
35463533
for( xCoreID = ( BaseType_t ) 0; xCoreID < ( BaseType_t ) configNUMBER_OF_CORES; xCoreID++ )
@@ -3570,20 +3557,20 @@ static BaseType_t prvCreateIdleTasks( void )
35703557
* only one idle task. */
35713558
#if ( configNUMBER_OF_CORES > 1 )
35723559
{
3560+
size_t uxIdleNameLength;
3561+
size_t uxCoreIDStrLength;
3562+
3563+
uxIdleNameLength = strlen( cIdleName );
3564+
3565+
/* Convert the core ID to a string. */
3566+
char cCoreIDStr[ 11 ];
3567+
snprintf( cCoreIDStr, sizeof( cCoreIDStr ), "%u", ( unsigned int ) xCoreID );
3568+
uxCoreIDStrLength = strlen( cCoreIDStr );
3569+
35733570
/* Append the idle task number to the end of the name if there is space. */
3574-
if( xIdleTaskNameIndex < ( BaseType_t ) configMAX_TASK_NAME_LEN )
3571+
if( uxIdleNameLength + uxCoreIDStrLength < ( BaseType_t ) configMAX_TASK_NAME_LEN )
35753572
{
3576-
cIdleName[ xIdleTaskNameIndex ] = ( char ) ( xCoreID + '0' );
3577-
3578-
/* And append a null character if there is space. */
3579-
if( ( xIdleTaskNameIndex + 1 ) < ( BaseType_t ) configMAX_TASK_NAME_LEN )
3580-
{
3581-
cIdleName[ xIdleTaskNameIndex + 1 ] = '\0';
3582-
}
3583-
else
3584-
{
3585-
mtCOVERAGE_TEST_MARKER();
3586-
}
3573+
strncat( cIdleName, cCoreIDStr, configMAX_TASK_NAME_LEN - uxIdleNameLength - 1 );
35873574
}
35883575
else
35893576
{

0 commit comments

Comments
 (0)