mirror of
				https://github.com/FreeRTOS/FreeRTOS-Kernel.git
				synced 2025-11-03 18:49:02 +01:00 
			
		
		
		
	fix possible NULL pointer dereference after call to configASSERT() (#1284)
Compiling with clang static code analysis, possible NULL pointer dereference are found. Since configASSERT() can possibly return and continue "normal" operation, the code in queue.c and stream_buffer.c can be adjusted to avoid NULL pointer exceptions. Signed-off-by: Florian La Roche <Florian.LaRoche@gmail.com>
This commit is contained in:
		
							parent
							
								
									0ae0715ac9
								
							
						
					
					
						commit
						a882b10526
					
				
							
								
								
									
										23
									
								
								queue.c
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								queue.c
									
									
									
									
									
								
							@ -1175,9 +1175,8 @@ BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    traceENTER_xQueueGenericSendFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken, xCopyPosition );
 | 
					    traceENTER_xQueueGenericSendFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken, xCopyPosition );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    configASSERT( pxQueue );
 | 
					    configASSERT( ( pxQueue != NULL ) && !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );
 | 
				
			||||||
    configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );
 | 
					    configASSERT( ( pxQueue != NULL ) && !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) );
 | 
				
			||||||
    configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* RTOS ports that support interrupt nesting have the concept of a maximum
 | 
					    /* RTOS ports that support interrupt nesting have the concept of a maximum
 | 
				
			||||||
     * system call (or maximum API call) interrupt priority.  Interrupts that are
 | 
					     * system call (or maximum API call) interrupt priority.  Interrupts that are
 | 
				
			||||||
@ -1351,16 +1350,14 @@ BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue,
 | 
				
			|||||||
     * not (i.e. has a task with a higher priority than us been woken by this
 | 
					     * not (i.e. has a task with a higher priority than us been woken by this
 | 
				
			||||||
     * post). */
 | 
					     * post). */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    configASSERT( pxQueue );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* xQueueGenericSendFromISR() should be used instead of xQueueGiveFromISR()
 | 
					    /* xQueueGenericSendFromISR() should be used instead of xQueueGiveFromISR()
 | 
				
			||||||
     * if the item size is not 0. */
 | 
					     * if the item size is not 0. */
 | 
				
			||||||
    configASSERT( pxQueue->uxItemSize == 0 );
 | 
					    configASSERT( ( pxQueue != NULL ) && ( pxQueue->uxItemSize == 0 ) );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Normally a mutex would not be given from an interrupt, especially if
 | 
					    /* Normally a mutex would not be given from an interrupt, especially if
 | 
				
			||||||
     * there is a mutex holder, as priority inheritance makes no sense for an
 | 
					     * there is a mutex holder, as priority inheritance makes no sense for an
 | 
				
			||||||
     * interrupts, only tasks. */
 | 
					     * interrupt, only tasks. */
 | 
				
			||||||
    configASSERT( !( ( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) && ( pxQueue->u.xSemaphore.xMutexHolder != NULL ) ) );
 | 
					    configASSERT( ( pxQueue != NULL ) && !( ( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) && ( pxQueue->u.xSemaphore.xMutexHolder != NULL ) ) );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* RTOS ports that support interrupt nesting have the concept of a maximum
 | 
					    /* RTOS ports that support interrupt nesting have the concept of a maximum
 | 
				
			||||||
     * system call (or maximum API call) interrupt priority.  Interrupts that are
 | 
					     * system call (or maximum API call) interrupt priority.  Interrupts that are
 | 
				
			||||||
@ -1895,12 +1892,9 @@ BaseType_t xQueuePeek( QueueHandle_t xQueue,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    traceENTER_xQueuePeek( xQueue, pvBuffer, xTicksToWait );
 | 
					    traceENTER_xQueuePeek( xQueue, pvBuffer, xTicksToWait );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Check the pointer is not NULL. */
 | 
					 | 
				
			||||||
    configASSERT( ( pxQueue ) );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* The buffer into which data is received can only be NULL if the data size
 | 
					    /* The buffer into which data is received can only be NULL if the data size
 | 
				
			||||||
     * is zero (so no data is copied into the buffer. */
 | 
					     * is zero (so no data is copied into the buffer. */
 | 
				
			||||||
    configASSERT( !( ( ( pvBuffer ) == NULL ) && ( ( pxQueue )->uxItemSize != ( UBaseType_t ) 0U ) ) );
 | 
					    configASSERT( ( pxQueue != NULL ) && !( ( ( pvBuffer ) == NULL ) && ( ( pxQueue )->uxItemSize != ( UBaseType_t ) 0U ) ) );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Cannot block if the scheduler is suspended. */
 | 
					    /* Cannot block if the scheduler is suspended. */
 | 
				
			||||||
    #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
 | 
					    #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
 | 
				
			||||||
@ -2152,9 +2146,8 @@ BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    traceENTER_xQueuePeekFromISR( xQueue, pvBuffer );
 | 
					    traceENTER_xQueuePeekFromISR( xQueue, pvBuffer );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    configASSERT( pxQueue );
 | 
					    configASSERT( ( pxQueue != NULL ) && !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );
 | 
				
			||||||
    configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );
 | 
					    configASSERT( ( pxQueue != NULL ) && ( pxQueue->uxItemSize != 0 ) ); /* Can't peek a semaphore. */
 | 
				
			||||||
    configASSERT( pxQueue->uxItemSize != 0 ); /* Can't peek a semaphore. */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* RTOS ports that support interrupt nesting have the concept of a maximum
 | 
					    /* RTOS ports that support interrupt nesting have the concept of a maximum
 | 
				
			||||||
     * system call (or maximum API call) interrupt priority.  Interrupts that are
 | 
					     * system call (or maximum API call) interrupt priority.  Interrupts that are
 | 
				
			||||||
 | 
				
			|||||||
@ -1653,11 +1653,9 @@ void vStreamBufferSetStreamBufferNotificationIndex( StreamBufferHandle_t xStream
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    traceENTER_vStreamBufferSetStreamBufferNotificationIndex( xStreamBuffer, uxNotificationIndex );
 | 
					    traceENTER_vStreamBufferSetStreamBufferNotificationIndex( xStreamBuffer, uxNotificationIndex );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    configASSERT( pxStreamBuffer );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* There should be no task waiting otherwise we'd never resume them. */
 | 
					    /* There should be no task waiting otherwise we'd never resume them. */
 | 
				
			||||||
    configASSERT( pxStreamBuffer->xTaskWaitingToReceive == NULL );
 | 
					    configASSERT( ( pxStreamBuffer != NULL ) && ( pxStreamBuffer->xTaskWaitingToReceive == NULL ) );
 | 
				
			||||||
    configASSERT( pxStreamBuffer->xTaskWaitingToSend == NULL );
 | 
					    configASSERT( ( pxStreamBuffer != NULL ) && ( pxStreamBuffer->xTaskWaitingToSend == NULL ) );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Check that the task notification index is valid. */
 | 
					    /* Check that the task notification index is valid. */
 | 
				
			||||||
    configASSERT( uxNotificationIndex < configTASK_NOTIFICATION_ARRAY_ENTRIES );
 | 
					    configASSERT( uxNotificationIndex < configTASK_NOTIFICATION_ARRAY_ENTRIES );
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user