mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2026-06-19 17:43:42 +02:00
Fix spurious heap_5 assert when allocation search reaches end marker (#1425)
When configENABLE_HEAP_PROTECTOR is 1 and a pvPortMalloc() request cannot be satisfied by any free block, the free list search advances onto the end marker (pxEnd) and validates it with heapVALIDATE_BLOCK_POINTER(). pxEnd is located at pucHeapHighAddress and is not part of the usable heap, so the macro's "( pxBlock ) < pucHeapHighAddress" bounds check fails and the configASSERT() fires on what is a normal out-of-memory condition. The code should instead fall through and call the malloc failed hook. Exclude the end marker from validation in the search loop so an allocation that cannot be satisfied returns NULL (and invokes vApplicationMallocFailedHook when configUSE_MALLOC_FAILED_HOOK is 1) without asserting.
This commit is contained in:
parent
97328600db
commit
d5d752a9b6
@ -284,7 +284,14 @@ void * pvPortMalloc( size_t xWantedSize )
|
|||||||
{
|
{
|
||||||
pxPreviousBlock = pxBlock;
|
pxPreviousBlock = pxBlock;
|
||||||
pxBlock = heapPROTECT_BLOCK_POINTER( pxBlock->pxNextFreeBlock );
|
pxBlock = heapPROTECT_BLOCK_POINTER( pxBlock->pxNextFreeBlock );
|
||||||
heapVALIDATE_BLOCK_POINTER( pxBlock );
|
|
||||||
|
/* pxEnd is the end marker of the free list. It is located at
|
||||||
|
* pucHeapHighAddress and is not part of the usable heap, so it
|
||||||
|
* must be excluded from the heap block pointer validation. */
|
||||||
|
if( pxBlock != pxEnd )
|
||||||
|
{
|
||||||
|
heapVALIDATE_BLOCK_POINTER( pxBlock );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If the end marker was reached then a block of adequate size
|
/* If the end marker was reached then a block of adequate size
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user