forked from epagris/FreeRTOS-Kernel
		
	Fix NULL pointer dereference in vPortGetHeapStats
When the heap is exhausted (no free block), start and end markers are
the only blocks present in the free block list:
     +---------------+     +-----------> NULL
     |               |     |
     |               V     |
+ ----- +            + ----- +
|   |   |            |   |   |
|   |   |            |   |   |
+ ----- +            + ----- +
  xStart               pxEnd
The code block which traverses the list of free blocks to calculate heap
stats used a do..while loop that moved past the end marker when the heap
had no free block resulting in a NULL pointer dereference. This commit
changes the do..while loop to while loop thereby ensuring that we never
move past the end marker.
This was reported here - https://github.com/FreeRTOS/FreeRTOS-Kernel/issues/534
Signed-off-by: Gaurav Aggarwal <aggarg@amazon.com>
			
			
This commit is contained in:
		
							parent
							
								
									dc9c034c85
								
							
						
					
					
						commit
						618e165fa7
					
				@ -494,7 +494,7 @@ void vPortGetHeapStats( HeapStats_t * pxHeapStats )
 | 
			
		||||
         * is initialised automatically when the first allocation is made. */
 | 
			
		||||
        if( pxBlock != NULL )
 | 
			
		||||
        {
 | 
			
		||||
            do
 | 
			
		||||
            while( pxBlock != pxEnd )
 | 
			
		||||
            {
 | 
			
		||||
                /* Increment the number of blocks and record the largest block seen
 | 
			
		||||
                 * so far. */
 | 
			
		||||
@ -513,7 +513,7 @@ void vPortGetHeapStats( HeapStats_t * pxHeapStats )
 | 
			
		||||
                /* Move to the next block in the chain until the last block is
 | 
			
		||||
                 * reached. */
 | 
			
		||||
                pxBlock = pxBlock->pxNextFreeBlock;
 | 
			
		||||
            } while( pxBlock != pxEnd );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    ( void ) xTaskResumeAll();
 | 
			
		||||
 | 
			
		||||
@ -544,7 +544,7 @@ void vPortGetHeapStats( HeapStats_t * pxHeapStats )
 | 
			
		||||
         * is initialised automatically when the first allocation is made. */
 | 
			
		||||
        if( pxBlock != NULL )
 | 
			
		||||
        {
 | 
			
		||||
            do
 | 
			
		||||
            while( pxBlock != pxEnd )
 | 
			
		||||
            {
 | 
			
		||||
                /* Increment the number of blocks and record the largest block seen
 | 
			
		||||
                 * so far. */
 | 
			
		||||
@ -569,7 +569,7 @@ void vPortGetHeapStats( HeapStats_t * pxHeapStats )
 | 
			
		||||
                /* Move to the next block in the chain until the last block is
 | 
			
		||||
                 * reached. */
 | 
			
		||||
                pxBlock = pxBlock->pxNextFreeBlock;
 | 
			
		||||
            } while( pxBlock != pxEnd );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    ( void ) xTaskResumeAll();
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user