summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2021-05-31 08:27:32 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2021-05-31 08:27:32 -0400
commit3b6540d8235fe2cdd62b8bd618ce424d3944a912 (patch)
treee499a2916ec743151b054bcab28e1a95de409349
parentdaf02d9b198906d93a9b289315d0fc1e519843ef (diff)
Fix weird access in ReallocFromHeap
-rw-r--r--arm9/src/error_message_reset.c2
-rw-r--r--arm9/src/game_init.c2
-rw-r--r--arm9/src/heap.c35
-rw-r--r--include/heap.h4
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);