mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-10-30 20:51:41 +00:00 
			
		
		
		
	 b7fc067c8c
			
		
	
	b7fc067c8c
	
	
	
		
			
			When realloc-ing to a smaller buffer size which ends up allocated in a different heap, the heap structure is corrupted. This can only happen: * If heap checking is Comprehensive (meaning buffers are never shrunk in place) and the heap the buffer was originally allocated in is full. * Calling heap_caps_realloc() to deliberately move a buffer to a different capabilities type, and shrink it at the same time. Probable fix for https://github.com/espressif/esp-idf/issues/1582 Probably the same issue: https://www.esp32.com/viewtopic.php?f=2&t=4583 https://www.esp32.com/viewtopic.php?f=13&t=3717
		
			
				
	
	
		
			51 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  Generic test for realloc
 | |
| */
 | |
| 
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| #include "unity.h"
 | |
| #include "sdkconfig.h"
 | |
| #include "esp_heap_caps.h"
 | |
| 
 | |
| 
 | |
| #ifndef CONFIG_HEAP_POISONING_COMPREHENSIVE
 | |
| /* (can't realloc in place if comprehensive is enabled) */
 | |
| 
 | |
| TEST_CASE("realloc shrink buffer in place", "[heap]")
 | |
| {
 | |
|     void *x = malloc(64);
 | |
|     TEST_ASSERT(x);
 | |
|     void *y = realloc(p, 48);
 | |
|     TEST_ASSERT_EQUAL_PTR(x, y);
 | |
| }
 | |
| 
 | |
| #endif
 | |
| 
 | |
| TEST_CASE("realloc move data to a new heap type", "[heap]")
 | |
| {
 | |
|     const char *test = "I am some test content to put in the heap";
 | |
|     char buf[64];
 | |
|     memset(buf, 0xEE, 64);
 | |
|     strlcpy(buf, test, 64);
 | |
| 
 | |
|     char *a = malloc(64);
 | |
|     memcpy(a, buf, 64);
 | |
| 
 | |
|     // move data from 'a' to IRAM
 | |
|     char *b = heap_caps_realloc(a, 64, MALLOC_CAP_EXEC);
 | |
|     TEST_ASSERT_NOT_NULL(b);
 | |
|     TEST_ASSERT_NOT_EQUAL(a, b);
 | |
|     TEST_ASSERT(heap_caps_check_integrity(MALLOC_CAP_INVALID, true));
 | |
|     TEST_ASSERT_EQUAL_HEX32_ARRAY(buf, b, 64/sizeof(uint32_t));
 | |
| 
 | |
|     // Move data back to DRAM
 | |
|     char *c = heap_caps_realloc(b, 48, MALLOC_CAP_8BIT);
 | |
|     TEST_ASSERT_NOT_NULL(c);
 | |
|     TEST_ASSERT_NOT_EQUAL(b, c);
 | |
|     TEST_ASSERT(heap_caps_check_integrity(MALLOC_CAP_INVALID, true));
 | |
|     TEST_ASSERT_EQUAL_HEX8_ARRAY(buf, c, 48);
 | |
| 
 | |
|     free(c);
 | |
| }
 |