Add runtime parameter checks (#758)

* Add runtime parameter checks

This commit adds runtime checks for function parameters
to mpu_wrappers_v2 file. The same checks are performed
in the API implementation using asserts.

Signed-off-by: kar-rahul-aws <karahulx@amazon.com>
This commit is contained in:
kar-rahul-aws 2023-08-17 18:53:42 +05:30 committed by GitHub
parent 0d871946ab
commit ace6b39fa0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 273 additions and 179 deletions

1
.github/lexicon.txt vendored
View file

@ -2469,6 +2469,7 @@ uxpriority
uxprioritytouse
uxqueue
uxqueuegetqueueitemsize
uxqueuegetqueuelength
uxqueuelength
uxqueuemessageswaiting
uxqueuespacesavailable

View file

@ -46,26 +46,6 @@
* correct privileged Vs unprivileged linkage and placement. */
#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021 See comment above. */
/* The following bit fields convey control information in a task's event list
* item value. It is important they don't clash with the
* taskEVENT_LIST_ITEM_VALUE_IN_USE definition. */
#if ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_16_BITS )
#define eventCLEAR_EVENTS_ON_EXIT_BIT 0x0100U
#define eventUNBLOCKED_DUE_TO_BIT_SET 0x0200U
#define eventWAIT_FOR_ALL_BITS 0x0400U
#define eventEVENT_BITS_CONTROL_BYTES 0xff00U
#elif ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_32_BITS )
#define eventCLEAR_EVENTS_ON_EXIT_BIT 0x01000000UL
#define eventUNBLOCKED_DUE_TO_BIT_SET 0x02000000UL
#define eventWAIT_FOR_ALL_BITS 0x04000000UL
#define eventEVENT_BITS_CONTROL_BYTES 0xff000000UL
#elif ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_64_BITS )
#define eventCLEAR_EVENTS_ON_EXIT_BIT 0x0100000000000000ULL
#define eventUNBLOCKED_DUE_TO_BIT_SET 0x0200000000000000ULL
#define eventWAIT_FOR_ALL_BITS 0x0400000000000000ULL
#define eventEVENT_BITS_CONTROL_BYTES 0xff00000000000000ULL
#endif /* if ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_16_BITS ) */
typedef struct EventGroupDef_t
{
EventBits_t uxEventBits;

View file

@ -36,6 +36,26 @@
/* FreeRTOS includes. */
#include "timers.h"
/* The following bit fields convey control information in a task's event list
* item value. It is important they don't clash with the
* taskEVENT_LIST_ITEM_VALUE_IN_USE definition. */
#if ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_16_BITS )
#define eventCLEAR_EVENTS_ON_EXIT_BIT 0x0100U
#define eventUNBLOCKED_DUE_TO_BIT_SET 0x0200U
#define eventWAIT_FOR_ALL_BITS 0x0400U
#define eventEVENT_BITS_CONTROL_BYTES 0xff00U
#elif ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_32_BITS )
#define eventCLEAR_EVENTS_ON_EXIT_BIT 0x01000000UL
#define eventUNBLOCKED_DUE_TO_BIT_SET 0x02000000UL
#define eventWAIT_FOR_ALL_BITS 0x04000000UL
#define eventEVENT_BITS_CONTROL_BYTES 0xff000000UL
#elif ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_64_BITS )
#define eventCLEAR_EVENTS_ON_EXIT_BIT 0x0100000000000000ULL
#define eventUNBLOCKED_DUE_TO_BIT_SET 0x0200000000000000ULL
#define eventWAIT_FOR_ALL_BITS 0x0400000000000000ULL
#define eventEVENT_BITS_CONTROL_BYTES 0xff00000000000000ULL
#endif /* if ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_16_BITS ) */
/* *INDENT-OFF* */
#ifdef __cplusplus
extern "C" {

View file

@ -1753,6 +1753,7 @@ void vQueueSetQueueNumber( QueueHandle_t xQueue,
UBaseType_t uxQueueGetQueueNumber( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
uint8_t ucQueueGetQueueType( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
UBaseType_t uxQueueGetQueueItemSize( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
UBaseType_t uxQueueGetQueueLength( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;
/* *INDENT-OFF* */
#ifdef __cplusplus

View file

@ -366,6 +366,8 @@
BaseType_t xReturn = pdFAIL;
BaseType_t xIsPreviousWakeTimeAccessible = pdFALSE;
if( ( pxPreviousWakeTime != NULL ) && ( xTimeIncrement > 0U ) )
{
xIsPreviousWakeTimeAccessible = xPortIsAuthorizedToAccessBuffer( pxPreviousWakeTime,
sizeof( TickType_t ),
( tskMPU_WRITE_PERMISSION | tskMPU_READ_PERMISSION ) );
@ -374,6 +376,7 @@
{
xReturn = xTaskDelayUntil( pxPreviousWakeTime, xTimeIncrement );
}
}
return xReturn;
}
@ -391,12 +394,6 @@
TaskHandle_t xInternalTaskHandle = NULL;
int32_t lIndex;
if( xTask == NULL )
{
xReturn = xTaskAbortDelay( xTask );
}
else
{
lIndex = ( int32_t ) xTask;
if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
@ -408,7 +405,6 @@
xReturn = xTaskAbortDelay( xInternalTaskHandle );
}
}
}
return xReturn;
}
@ -473,12 +469,6 @@
TaskHandle_t xInternalTaskHandle = NULL;
int32_t lIndex;
if( pxTask == NULL )
{
eReturn = eTaskGetState( pxTask );
}
else
{
lIndex = ( int32_t ) pxTask;
if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
@ -490,7 +480,6 @@
eReturn = eTaskGetState( xInternalTaskHandle );
}
}
}
return eReturn;
}
@ -577,7 +566,11 @@
{
/* After the scheduler starts, only privileged tasks are allowed
* to suspend other tasks. */
#if ( INCLUDE_xTaskGetSchedulerState == 1 )
if( ( xTaskGetSchedulerState() == taskSCHEDULER_NOT_STARTED ) || ( portIS_TASK_PRIVILEGED() == pdTRUE ) )
#else
if( portIS_TASK_PRIVILEGED() == pdTRUE )
#endif
{
lIndex = ( int32_t ) pxTaskToSuspend;
@ -1078,6 +1071,8 @@
{
BaseType_t xIsTimeOutWriteable = pdFALSE;
if( pxTimeOut != NULL )
{
xIsTimeOutWriteable = xPortIsAuthorizedToAccessBuffer( pxTimeOut,
sizeof( TimeOut_t ),
tskMPU_WRITE_PERMISSION );
@ -1087,6 +1082,7 @@
vTaskSetTimeOutState( pxTimeOut );
}
}
}
/*-----------------------------------------------------------*/
BaseType_t MPU_xTaskCheckForTimeOutImpl( TimeOut_t * const pxTimeOut,
@ -1099,6 +1095,8 @@
BaseType_t xIsTimeOutWriteable = pdFALSE;
BaseType_t xIsTicksToWaitWriteable = pdFALSE;
if( ( pxTimeOut != NULL ) && ( pxTicksToWait != NULL ) )
{
xIsTimeOutWriteable = xPortIsAuthorizedToAccessBuffer( pxTimeOut,
sizeof( TimeOut_t ),
tskMPU_WRITE_PERMISSION );
@ -1110,6 +1108,7 @@
{
xReturn = xTaskCheckForTimeOut( pxTimeOut, pxTicksToWait );
}
}
return xReturn;
}
@ -1134,6 +1133,8 @@
TaskHandle_t xInternalTaskHandle = NULL;
BaseType_t xIsPreviousNotificationValueWriteable = pdFALSE;
if( uxIndexToNotify < configTASK_NOTIFICATION_ARRAY_ENTRIES )
{
if( pulPreviousNotificationValue != NULL )
{
xIsPreviousNotificationValueWriteable = xPortIsAuthorizedToAccessBuffer( pulPreviousNotificationValue,
@ -1155,6 +1156,7 @@
}
}
}
}
return xReturn;
}
@ -1179,6 +1181,8 @@
BaseType_t xReturn = pdFAIL;
BaseType_t xIsNotificationValueWritable = pdFALSE;
if( uxIndexToWaitOn < configTASK_NOTIFICATION_ARRAY_ENTRIES )
{
if( pulNotificationValue != NULL )
{
xIsNotificationValueWritable = xPortIsAuthorizedToAccessBuffer( pulNotificationValue,
@ -1190,6 +1194,7 @@
{
xReturn = xTaskGenericNotifyWait( uxIndexToWaitOn, ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait );
}
}
return xReturn;
}
@ -1207,9 +1212,12 @@
BaseType_t xClearCountOnExit,
TickType_t xTicksToWait ) /* PRIVILEGED_FUNCTION */
{
uint32_t ulReturn;
uint32_t ulReturn = 0;
if( uxIndexToWaitOn < configTASK_NOTIFICATION_ARRAY_ENTRIES )
{
ulReturn = ulTaskGenericNotifyTake( uxIndexToWaitOn, xClearCountOnExit, xTicksToWait );
}
return ulReturn;
}
@ -1229,6 +1237,8 @@
int32_t lIndex;
TaskHandle_t xInternalTaskHandle = NULL;
if( uxIndexToClear < configTASK_NOTIFICATION_ARRAY_ENTRIES )
{
if( xTask == NULL )
{
xReturn = xTaskGenericNotifyStateClear( xTask, uxIndexToClear );
@ -1247,6 +1257,7 @@
}
}
}
}
return xReturn;
}
@ -1268,6 +1279,8 @@
int32_t lIndex;
TaskHandle_t xInternalTaskHandle = NULL;
if( uxIndexToClear < configTASK_NOTIFICATION_ARRAY_ENTRIES )
{
if( xTask == NULL )
{
ulReturn = ulTaskGenericNotifyValueClear( xTask, uxIndexToClear, ulBitsToClear );
@ -1286,6 +1299,7 @@
}
}
}
}
return ulReturn;
}
@ -1811,6 +1825,7 @@
QueueHandle_t xInternalQueueHandle = NULL;
BaseType_t xReturn = pdFAIL;
BaseType_t xIsItemToQueueReadable = pdFALSE;
UBaseType_t uxQueueItemSize, uxQueueLength;
lIndex = ( int32_t ) xQueue;
@ -1819,6 +1834,16 @@
xInternalQueueHandle = MPU_GetQueueHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
if( xInternalQueueHandle != NULL )
{
uxQueueItemSize = uxQueueGetQueueItemSize( xInternalQueueHandle );
uxQueueLength = uxQueueGetQueueLength( xInternalQueueHandle );
if( ( !( ( pvItemToQueue == NULL ) && ( uxQueueItemSize != ( UBaseType_t ) 0U ) ) ) &&
( !( ( xCopyPosition == queueOVERWRITE ) && ( uxQueueLength != ( UBaseType_t ) 1U ) ) )
#if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
&& ( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) )
#endif
)
{
if( pvItemToQueue != NULL )
{
@ -1833,6 +1858,7 @@
}
}
}
}
return xReturn;
}
@ -1898,6 +1924,7 @@
QueueHandle_t xInternalQueueHandle = NULL;
BaseType_t xReturn = pdFAIL;
BaseType_t xIsReceiveBufferWritable = pdFALSE;
UBaseType_t uxQueueItemSize;
lIndex = ( int32_t ) pxQueue;
@ -1906,6 +1933,14 @@
xInternalQueueHandle = MPU_GetQueueHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
if( xInternalQueueHandle != NULL )
{
uxQueueItemSize = uxQueueGetQueueItemSize( xInternalQueueHandle );
if( ( !( ( ( pvBuffer ) == NULL ) && ( uxQueueItemSize != ( UBaseType_t ) 0U ) ) )
#if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
&& ( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) )
#endif
)
{
xIsReceiveBufferWritable = xPortIsAuthorizedToAccessBuffer( pvBuffer,
uxQueueGetQueueItemSize( xInternalQueueHandle ),
@ -1917,6 +1952,7 @@
}
}
}
}
return xReturn;
}
@ -1934,6 +1970,7 @@
QueueHandle_t xInternalQueueHandle = NULL;
BaseType_t xReturn = pdFAIL;
BaseType_t xIsReceiveBufferWritable = pdFALSE;
UBaseType_t uxQueueItemSize;
lIndex = ( int32_t ) xQueue;
@ -1942,6 +1979,14 @@
xInternalQueueHandle = MPU_GetQueueHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
if( xInternalQueueHandle != NULL )
{
uxQueueItemSize = uxQueueGetQueueItemSize( xInternalQueueHandle );
if( ( !( ( ( pvBuffer ) == NULL ) && ( uxQueueItemSize != ( UBaseType_t ) 0U ) ) )
#if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
&& ( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) )
#endif
)
{
xIsReceiveBufferWritable = xPortIsAuthorizedToAccessBuffer( pvBuffer,
uxQueueGetQueueItemSize( xInternalQueueHandle ),
@ -1953,6 +1998,7 @@
}
}
}
}
return xReturn;
}
@ -1967,6 +2013,7 @@
int32_t lIndex;
QueueHandle_t xInternalQueueHandle = NULL;
BaseType_t xReturn = pdFAIL;
UBaseType_t uxQueueItemSize;
lIndex = ( int32_t ) xQueue;
@ -1975,10 +2022,19 @@
xInternalQueueHandle = MPU_GetQueueHandleAtIndex( CONVERT_TO_INTERNAL_INDEX( lIndex ) );
if( xInternalQueueHandle != NULL )
{
uxQueueItemSize = uxQueueGetQueueItemSize( xInternalQueueHandle );
if( ( uxQueueItemSize == 0 )
#if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
&& ( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) )
#endif
)
{
xReturn = xQueueSemaphoreTake( xInternalQueueHandle, xTicksToWait );
}
}
}
return xReturn;
}
@ -3252,6 +3308,13 @@
EventGroupHandle_t xInternalEventGroupHandle = NULL;
int32_t lIndex;
if( ( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 ) &&
( uxBitsToWaitFor != 0 )
#if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
&& ( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) )
#endif
)
{
lIndex = ( int32_t ) xEventGroup;
if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
@ -3263,6 +3326,7 @@
xReturn = xEventGroupWaitBits( xInternalEventGroupHandle, uxBitsToWaitFor, xClearOnExit, xWaitForAllBits, xTicksToWait );
}
}
}
return xReturn;
}
@ -3278,6 +3342,8 @@
EventGroupHandle_t xInternalEventGroupHandle = NULL;
int32_t lIndex;
if( ( uxBitsToClear & eventEVENT_BITS_CONTROL_BYTES ) == 0 )
{
lIndex = ( int32_t ) xEventGroup;
if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
@ -3289,6 +3355,7 @@
xReturn = xEventGroupClearBits( xInternalEventGroupHandle, uxBitsToClear );
}
}
}
return xReturn;
}
@ -3304,6 +3371,8 @@
EventGroupHandle_t xInternalEventGroupHandle = NULL;
int32_t lIndex;
if( ( uxBitsToSet & eventEVENT_BITS_CONTROL_BYTES ) == 0 )
{
lIndex = ( int32_t ) xEventGroup;
if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
@ -3315,6 +3384,7 @@
xReturn = xEventGroupSetBits( xInternalEventGroupHandle, uxBitsToSet );
}
}
}
return xReturn;
}
@ -3334,6 +3404,13 @@
EventGroupHandle_t xInternalEventGroupHandle = NULL;
int32_t lIndex;
if( ( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 ) &&
( uxBitsToWaitFor != 0 )
#if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
&& ( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) )
#endif
)
{
lIndex = ( int32_t ) xEventGroup;
if( IS_EXTERNAL_INDEX_VALID( lIndex ) != pdFALSE )
@ -3345,6 +3422,7 @@
xReturn = xEventGroupSync( xInternalEventGroupHandle, uxBitsToSet, uxBitsToWaitFor, xTicksToWait );
}
}
}
return xReturn;
}
@ -3615,6 +3693,8 @@
int32_t lIndex;
BaseType_t xIsTxDataBufferReadable = pdFALSE;
if( pvTxData != NULL )
{
xIsTxDataBufferReadable = xPortIsAuthorizedToAccessBuffer( pvTxData,
xDataLengthBytes,
tskMPU_READ_PERMISSION );
@ -3633,6 +3713,7 @@
}
}
}
}
return xReturn;
}
@ -3653,6 +3734,8 @@
int32_t lIndex;
BaseType_t xIsRxDataBufferWriteable = pdFALSE;
if( pvRxData != NULL )
{
xIsRxDataBufferWriteable = xPortIsAuthorizedToAccessBuffer( pvRxData,
xBufferLengthBytes,
tskMPU_WRITE_PERMISSION );
@ -3671,6 +3754,7 @@
}
}
}
}
return xReturn;
}

View file

@ -2200,6 +2200,12 @@ UBaseType_t uxQueueGetQueueItemSize( QueueHandle_t xQueue ) /* PRIVILEGED_FUNCTI
}
/*-----------------------------------------------------------*/
UBaseType_t uxQueueGetQueueLength( QueueHandle_t xQueue ) /* PRIVILEGED_FUNCTION */
{
return ( ( Queue_t * ) xQueue )->uxLength;
}
/*-----------------------------------------------------------*/
#if ( configUSE_MUTEXES == 1 )
static UBaseType_t prvGetDisinheritPriorityAfterTimeout( const Queue_t * const pxQueue )

View file

@ -5306,6 +5306,8 @@ TickType_t uxTaskResetEventItemValue( void )
TCB_t * pxTCB;
uint32_t ulReturn;
configASSERT( uxIndexToClear < configTASK_NOTIFICATION_ARRAY_ENTRIES );
/* If null is passed in here then it is the calling task that is having
* its notification state cleared. */
pxTCB = prvGetTCBFromHandle( xTask );