Skip to content

Commit 09f439b

Browse files
enkillerBernardXiong
authored andcommitted
[memheap] Fix 64 bit potential risk
1 parent 85441c0 commit 09f439b

File tree

5 files changed

+43
-37
lines changed

5 files changed

+43
-37
lines changed

components/finsh/msh.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ MSH_CMD_EXPORT_ALIAS(cmd_ps, ps, List threads in the system.);
7171
#ifdef RT_USING_HEAP
7272
int cmd_free(int argc, char **argv)
7373
{
74-
rt_uint32_t total = 0, used = 0, max_used = 0;
74+
rt_size_t total = 0, used = 0, max_used = 0;
7575

7676
rt_memory_info(&total, &used, &max_used);
7777
rt_kprintf("total : %d\n", total);

include/rtdef.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -927,9 +927,9 @@ struct rt_memheap
927927

928928
void *start_addr; /**< pool start address and size */
929929

930-
rt_uint32_t pool_size; /**< pool size */
931-
rt_uint32_t available_size; /**< available size */
932-
rt_uint32_t max_used_size; /**< maximum allocated size */
930+
rt_size_t pool_size; /**< pool size */
931+
rt_size_t available_size; /**< available size */
932+
rt_size_t max_used_size; /**< maximum allocated size */
933933

934934
struct rt_memheap_item *block_list; /**< used block list */
935935

include/rtthread.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -266,9 +266,9 @@ void *rt_calloc(rt_size_t count, rt_size_t size);
266266
void *rt_malloc_align(rt_size_t size, rt_size_t align);
267267
void rt_free_align(void *ptr);
268268

269-
void rt_memory_info(rt_uint32_t *total,
270-
rt_uint32_t *used,
271-
rt_uint32_t *max_used);
269+
void rt_memory_info(rt_size_t *total,
270+
rt_size_t *used,
271+
rt_size_t *max_used);
272272

273273
#if defined(RT_USING_SLAB) && defined(RT_USING_SLAB_AS_HEAP)
274274
void *rt_page_alloc(rt_size_t npages);
@@ -308,9 +308,9 @@ void *rt_memheap_alloc(struct rt_memheap *heap, rt_size_t size);
308308
void *rt_memheap_realloc(struct rt_memheap *heap, void *ptr, rt_size_t newsize);
309309
void rt_memheap_free(void *ptr);
310310
void rt_memheap_info(struct rt_memheap *heap,
311-
rt_uint32_t *total,
312-
rt_uint32_t *used,
313-
rt_uint32_t *max_used);
311+
rt_size_t *total,
312+
rt_size_t *used,
313+
rt_size_t *max_used);
314314
#endif
315315

316316
#ifdef RT_USING_SLAB

src/kservice.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1558,9 +1558,9 @@ RTM_EXPORT(rt_free);
15581558
*
15591559
* @param max_used is a pointer to get the maximum memory used.
15601560
*/
1561-
RT_WEAK void rt_memory_info(rt_uint32_t *total,
1562-
rt_uint32_t *used,
1563-
rt_uint32_t *max_used)
1561+
RT_WEAK void rt_memory_info(rt_size_t *total,
1562+
rt_size_t *used,
1563+
rt_size_t *max_used)
15641564
{
15651565
rt_base_t level;
15661566

src/memheap.c

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727

2828
/* dynamic pool magic and mask */
2929
#define RT_MEMHEAP_MAGIC 0x1ea01ea0
30-
#define RT_MEMHEAP_MASK 0xfffffffe
30+
#define RT_MEMHEAP_MASK 0xFFFFFFFE
3131
#define RT_MEMHEAP_USED 0x01
3232
#define RT_MEMHEAP_FREED 0x00
3333

@@ -38,6 +38,16 @@
3838
#define MEMITEM_SIZE(item) ((rt_ubase_t)item->next - (rt_ubase_t)item - RT_MEMHEAP_SIZE)
3939
#define MEMITEM(ptr) (struct rt_memheap_item*)((rt_uint8_t*)ptr - RT_MEMHEAP_SIZE)
4040

41+
static void _remove_next_ptr(struct rt_memheap_item *next_ptr)
42+
{
43+
/* Fix the crash problem after opening Oz optimization on ac6 */
44+
/* Fix IAR compiler warning */
45+
next_ptr->next_free->prev_free = next_ptr->prev_free;
46+
next_ptr->prev_free->next_free = next_ptr->next_free;
47+
next_ptr->next->prev = next_ptr->prev;
48+
next_ptr->prev->next = next_ptr->next;
49+
}
50+
4151
/**
4252
* @brief This function initializes a piece of memory called memheap.
4353
*
@@ -173,7 +183,7 @@ RTM_EXPORT(rt_memheap_detach);
173183
void *rt_memheap_alloc(struct rt_memheap *heap, rt_size_t size)
174184
{
175185
rt_err_t result;
176-
rt_uint32_t free_size;
186+
rt_size_t free_size;
177187
struct rt_memheap_item *header_ptr;
178188

179189
RT_ASSERT(heap != RT_NULL);
@@ -382,8 +392,7 @@ void *rt_memheap_realloc(struct rt_memheap *heap, void *ptr, rt_size_t newsize)
382392
if (newsize > oldsize)
383393
{
384394
void *new_ptr;
385-
/* Fix the crash problem after opening Oz optimization on ac6 */
386-
volatile struct rt_memheap_item *next_ptr;
395+
struct rt_memheap_item *next_ptr;
387396

388397
if (heap->locked == RT_FALSE)
389398
{
@@ -432,10 +441,7 @@ void *rt_memheap_realloc(struct rt_memheap *heap, void *ptr, rt_size_t newsize)
432441
next_ptr->next_free,
433442
next_ptr->prev_free));
434443

435-
next_ptr->next_free->prev_free = next_ptr->prev_free;
436-
next_ptr->prev_free->next_free = next_ptr->next_free;
437-
next_ptr->next->prev = next_ptr->prev;
438-
next_ptr->prev->next = next_ptr->next;
444+
_remove_next_ptr(next_ptr);
439445

440446
/* build a new one on the right place */
441447
next_ptr = (struct rt_memheap_item *)((char *)ptr + newsize);
@@ -593,13 +599,13 @@ void rt_memheap_free(void *ptr)
593599
rt_err_t result;
594600
struct rt_memheap *heap;
595601
struct rt_memheap_item *header_ptr, *new_ptr;
596-
rt_uint32_t insert_header;
602+
rt_bool_t insert_header;
597603

598604
/* NULL check */
599605
if (ptr == RT_NULL) return;
600606

601607
/* set initial status as OK */
602-
insert_header = 1;
608+
insert_header = RT_TRUE;
603609
new_ptr = RT_NULL;
604610
header_ptr = (struct rt_memheap_item *)
605611
((rt_uint8_t *)ptr - RT_MEMHEAP_SIZE);
@@ -657,7 +663,7 @@ void rt_memheap_free(void *ptr)
657663
/* move header pointer to previous. */
658664
header_ptr = header_ptr->prev;
659665
/* don't insert header to free list */
660-
insert_header = 0;
666+
insert_header = RT_FALSE;
661667
}
662668

663669
/* determine if the block can be merged with the next neighbor. */
@@ -685,10 +691,10 @@ void rt_memheap_free(void *ptr)
685691
{
686692
struct rt_memheap_item *n = heap->free_list->next_free;;
687693
#if defined(RT_MEMHEAP_BSET_MODE)
688-
rt_uint32_t blk_size = MEMITEM_SIZE(header_ptr);
694+
rt_size_t blk_size = MEMITEM_SIZE(header_ptr);
689695
for (;n != heap->free_list; n = n->next_free)
690696
{
691-
rt_uint32_t m = MEMITEM_SIZE(n);
697+
rt_size_t m = MEMITEM_SIZE(n);
692698
if (blk_size <= m)
693699
{
694700
break;
@@ -732,9 +738,9 @@ RTM_EXPORT(rt_memheap_free);
732738
* @param max_used is a pointer to get the maximum memory used.
733739
*/
734740
void rt_memheap_info(struct rt_memheap *heap,
735-
rt_uint32_t *total,
736-
rt_uint32_t *used,
737-
rt_uint32_t *max_used)
741+
rt_size_t *total,
742+
rt_size_t *used,
743+
rt_size_t *max_used)
738744
{
739745
rt_err_t result;
740746

@@ -898,10 +904,10 @@ int memheapcheck(int argc, char *argv[])
898904
break;
899905
}
900906
/* check next and prev */
901-
if (!((rt_uint32_t)item->next <= (rt_uint32_t)((rt_uint32_t)heap->start_addr + heap->pool_size) &&
902-
(rt_uint32_t)item->prev >= (rt_uint32_t)heap->start_addr) &&
903-
(rt_uint32_t)item->next == RT_ALIGN((rt_uint32_t)item->next, RT_ALIGN_SIZE) &&
904-
(rt_uint32_t)item->prev == RT_ALIGN((rt_uint32_t)item->prev, RT_ALIGN_SIZE))
907+
if (!((rt_ubase_t)item->next <= (rt_ubase_t)((rt_ubase_t)heap->start_addr + heap->pool_size) &&
908+
(rt_ubase_t)item->prev >= (rt_ubase_t)heap->start_addr) &&
909+
(rt_ubase_t)item->next == RT_ALIGN((rt_ubase_t)item->next, RT_ALIGN_SIZE) &&
910+
(rt_ubase_t)item->prev == RT_ALIGN((rt_ubase_t)item->prev, RT_ALIGN_SIZE))
905911
{
906912
has_bad = RT_TRUE;
907913
break;
@@ -919,7 +925,7 @@ int memheapcheck(int argc, char *argv[])
919925
{
920926
rt_kprintf("Memory block wrong:\n");
921927
rt_kprintf("name: %s\n", heap->parent.name);
922-
rt_kprintf("item: 0x%08x\n", item);
928+
rt_kprintf("item: 0x%p\n", item);
923929
}
924930
return 0;
925931
}
@@ -948,7 +954,7 @@ int memheaptrace(int argc, char *argv[])
948954
/* memheap dump */
949955
rt_kprintf("\nmemory heap address:\n");
950956
rt_kprintf("name : %s\n", mh->parent.name);
951-
rt_kprintf("heap_ptr: 0x%08x\n", mh->start_addr);
957+
rt_kprintf("heap_ptr: 0x%p\n", mh->start_addr);
952958
rt_kprintf("free : 0x%08x\n", mh->available_size);
953959
rt_kprintf("max_used: 0x%08x\n", mh->max_used_size);
954960
rt_kprintf("size : 0x%08x\n", mh->pool_size);
@@ -960,7 +966,7 @@ int memheaptrace(int argc, char *argv[])
960966
{
961967
if ((header_ptr->magic & RT_MEMHEAP_MASK) != RT_MEMHEAP_MAGIC)
962968
{
963-
rt_kprintf("[0x%08x - incorrect magic: 0x%08x\n",
969+
rt_kprintf("[0x%p - incorrect magic: 0x%08x\n",
964970
header_ptr, header_ptr->magic);
965971
break;
966972
}
@@ -969,7 +975,7 @@ int memheaptrace(int argc, char *argv[])
969975
if (block_size < 0)
970976
break;
971977

972-
rt_kprintf("[0x%08x - ", header_ptr);
978+
rt_kprintf("[0x%p - ", header_ptr);
973979
if (block_size < 1024)
974980
rt_kprintf("%5d", block_size);
975981
else if (block_size < 1024 * 1024)

0 commit comments

Comments
 (0)