diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2021-05-31 08:27:32 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2021-05-31 08:27:32 -0400 |
commit | 3b6540d8235fe2cdd62b8bd618ce424d3944a912 (patch) | |
tree | e499a2916ec743151b054bcab28e1a95de409349 | |
parent | daf02d9b198906d93a9b289315d0fc1e519843ef (diff) |
Fix weird access in ReallocFromHeap
-rw-r--r-- | arm9/src/error_message_reset.c | 2 | ||||
-rw-r--r-- | arm9/src/game_init.c | 2 | ||||
-rw-r--r-- | arm9/src/heap.c | 35 | ||||
-rw-r--r-- | include/heap.h | 4 |
4 files changed, 22 insertions, 21 deletions
diff --git a/arm9/src/error_message_reset.c b/arm9/src/error_message_reset.c index 520a5077..de039375 100644 --- a/arm9/src/error_message_reset.c +++ b/arm9/src/error_message_reset.c @@ -8,7 +8,7 @@ const struct UnkStruct_02016B94_4 UNK_020FF49C = { 0, 3, 3, 0x1a, 0x12, 1, 0x23 }; -const struct UnkStruct_020EDB10 UNK_020FF4A4[] = { +const struct HeapParam UNK_020FF4A4[] = { {0x00020000, OS_ARENA_MAIN} }; diff --git a/arm9/src/game_init.c b/arm9/src/game_init.c index f907d646..840b17a4 100644 --- a/arm9/src/game_init.c +++ b/arm9/src/game_init.c @@ -119,7 +119,7 @@ void Main_ToggleHBlankInterrupt(BOOL enableFlag) (void)OS_EnableIrq(); } -const struct UnkStruct_020EDB10 UNK_020EDB10[] = { +const struct HeapParam UNK_020EDB10[] = { { 0x00D000, OS_ARENA_MAIN }, { 0x021000, OS_ARENA_MAIN }, { 0x001000, OS_ARENA_MAIN }, diff --git a/arm9/src/heap.c b/arm9/src/heap.c index ba3776ac..842fd33a 100644 --- a/arm9/src/heap.c +++ b/arm9/src/heap.c @@ -26,7 +26,7 @@ typedef struct MemoryBlock struct HeapInfo sHeapInfo; -THUMB_FUNC void InitHeapSystem(const struct UnkStruct_020EDB10 *templates, u32 nTemplates, u32 totalNumHeaps, u32 pre_size) +THUMB_FUNC void InitHeapSystem(const struct HeapParam *templates, u32 nTemplates, u32 totalNumHeaps, u32 pre_size) { void * ptr; u32 unk_size, i; @@ -39,6 +39,7 @@ THUMB_FUNC void InitHeapSystem(const struct UnkStruct_020EDB10 *templates, u32 n } if (pre_size != 0) { + // force align while (pre_size % 4 != 0) { pre_size++; @@ -113,7 +114,6 @@ THUMB_FUNC void InitHeapSystem(const struct UnkStruct_020EDB10 *templates, u32 n THUMB_FUNC s32 FindFirstAvailableHeapHandle() { s32 i; - s32 j; for (i = sHeapInfo.nTemplates; i < sHeapInfo.maxHeaps; i++) { @@ -153,7 +153,7 @@ THUMB_FUNC BOOL CreateHeapInternal(u32 parent, u32 child, u32 size, s32 alignmen sHeapInfo.heapHandles[i] = NNS_FndCreateExpHeap(newHeapAddr, size); - if (sHeapInfo.heapHandles[i] != 0) + if (sHeapInfo.heapHandles[i] != NULL) { sHeapInfo.parentHeapHandles[i] = parentHeap; sHeapInfo.subHeapRawPtrs[i] = newHeapAddr; @@ -185,12 +185,12 @@ THUMB_FUNC BOOL CreateHeapInternal(u32 parent, u32 child, u32 size, s32 alignmen { GF_ASSERT(0); } - return 0; + return FALSE; } THUMB_FUNC void DestroyHeap(u32 heap_id) { - GF_ASSERT (OS_GetProcMode() != OS_PROCMODE_IRQ); + GF_ASSERT(OS_GetProcMode() != OS_PROCMODE_IRQ); NNSFndHeapHandle handle = sHeapInfo.heapHandles[sHeapInfo.heapIdxs[heap_id]]; @@ -223,7 +223,7 @@ THUMB_FUNC void *AllocFromHeapInternal(NNSFndHeapHandle heap, u32 size, s32 alig GF_ASSERT(heap); OSIntrMode intr_mode = OS_DisableInterrupts(); - size += 16; + size += sizeof(MemoryBlock); void *ptr = NNS_FndAllocFromExpHeapEx(heap, size, alignment); OS_RestoreInterrupts(intr_mode); @@ -247,7 +247,7 @@ THUMB_FUNC void AllocFail() void *AllocFromHeap(u32 heap_id, u32 size) { - void *ptr = 0; + void *ptr = NULL; if (heap_id < sHeapInfo.totalNumHeaps) { u8 index = sHeapInfo.heapIdxs[heap_id]; @@ -267,7 +267,7 @@ void *AllocFromHeap(u32 heap_id, u32 size) void *AllocFromHeapAtEnd(u32 heap_id, u32 size) { - void *ptr = 0; + void *ptr = NULL; if (heap_id < sHeapInfo.totalNumHeaps) { u8 index = sHeapInfo.heapIdxs[heap_id]; @@ -315,19 +315,19 @@ void FreeToHeap(void *ptr) void FreeToHeapExplicit(u32 heap_id, void *ptr) { - GF_ASSERT (OS_GetProcMode() != OS_PROCMODE_IRQ); + GF_ASSERT(OS_GetProcMode() != OS_PROCMODE_IRQ); if (heap_id < sHeapInfo.totalNumHeaps) { u8 index = sHeapInfo.heapIdxs[heap_id]; NNSFndHeapHandle heap = sHeapInfo.heapHandles[index]; - GF_ASSERT ( heap != NULL ); + GF_ASSERT( heap != NULL ); ptr -= sizeof(MemoryBlock); - GF_ASSERT (((MemoryBlock *)ptr)->heapId == heap_id); + GF_ASSERT(((MemoryBlock *)ptr)->heapId == heap_id); NNS_FndFreeToExpHeap(heap, ptr); - GF_ASSERT (sHeapInfo.numMemBlocks[heap_id] != 0); + GF_ASSERT(sHeapInfo.numMemBlocks[heap_id] != 0); sHeapInfo.numMemBlocks[heap_id]--; return; @@ -363,16 +363,17 @@ THUMB_FUNC void GF_ExpHeap_FndInitAllocator(NNSFndAllocator * pAllocator, u32 he THUMB_FUNC void ReallocFromHeap(void *ptr, u32 newSize) { - GF_ASSERT (OS_GetProcMode() != OS_PROCMODE_IRQ); + GF_ASSERT(OS_GetProcMode() != OS_PROCMODE_IRQ); - newSize += 16; - if (NNS_FndGetSizeForMBlockExpHeap(ptr - 16) >= newSize) + newSize += sizeof(MemoryBlock); + ptr -= sizeof(MemoryBlock); + if (NNS_FndGetSizeForMBlockExpHeap(ptr) >= newSize) { - u8 heap_id = (u8)((u32 *)ptr)[-1]; + u32 heap_id = ((MemoryBlock *)ptr)->heapId; u8 index = sHeapInfo.heapIdxs[heap_id]; - NNS_FndResizeForMBlockExpHeap(sHeapInfo.heapHandles[index], ptr - 16, newSize); + NNS_FndResizeForMBlockExpHeap(sHeapInfo.heapHandles[index], ptr, newSize); return; } GF_ASSERT(0); diff --git a/include/heap.h b/include/heap.h index 6910d4a6..36c747a7 100644 --- a/include/heap.h +++ b/include/heap.h @@ -5,13 +5,13 @@ #include "NNS_FND_expheap.h" #include "NNS_FND_allocator.h" -struct UnkStruct_020EDB10 +struct HeapParam { u32 size; OSArenaId arena; }; -void InitHeapSystem(const struct UnkStruct_020EDB10 *templates, u32 nTemplates, u32 totalNumHeaps, u32 pre_size); +void InitHeapSystem(const struct HeapParam *templates, u32 nTemplates, u32 totalNumHeaps, u32 pre_size); s32 FindFirstAvailableHeapHandle(); BOOL CreateHeap(u32 parent, u32 child, u32 size); BOOL CreateHeapAtEnd(u32 parent, u32 child, u32 size); |