Skip to content

Commit d5d752a

Browse files
authored
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.
1 parent 9732860 commit d5d752a

1 file changed

Lines changed: 8 additions & 1 deletion

File tree

portable/MemMang/heap_5.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,14 @@ void * pvPortMalloc( size_t xWantedSize )
284284
{
285285
pxPreviousBlock = pxBlock;
286286
pxBlock = heapPROTECT_BLOCK_POINTER( pxBlock->pxNextFreeBlock );
287-
heapVALIDATE_BLOCK_POINTER( pxBlock );
287+
288+
/* pxEnd is the end marker of the free list. It is located at
289+
* pucHeapHighAddress and is not part of the usable heap, so it
290+
* must be excluded from the heap block pointer validation. */
291+
if( pxBlock != pxEnd )
292+
{
293+
heapVALIDATE_BLOCK_POINTER( pxBlock );
294+
}
288295
}
289296

290297
/* If the end marker was reached then a block of adequate size

0 commit comments

Comments
 (0)