From da572cc718333a65d7a0f81d6baa106d17ca70c6 Mon Sep 17 00:00:00 2001 From: ToyB-Chan Date: Wed, 10 Jun 2026 04:10:12 +0200 Subject: [PATCH] =?UTF-8?q?changed=20the=20way=20allocation=20sizes=20are?= =?UTF-8?q?=20calculated=20(=E2=98=A0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- minimal_heap_implementation.inl | 32 ++++++++++++++++++-------------- minimal_heap_test.c | 6 +++--- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/minimal_heap_implementation.inl b/minimal_heap_implementation.inl index 5d4fd30..71bf711 100644 --- a/minimal_heap_implementation.inl +++ b/minimal_heap_implementation.inl @@ -156,12 +156,13 @@ void* MIHP_Allocate(MIHP_Heap* heap, size_t size) size_t segmentHeaderSize = MIHP_GetHeapAlignedSize(heap, sizeof(MIHP_HeapSegmentHeader)); MIHP_HeapSegmentHeader* targetSegment = NULL; - if (currentSegment->SegmentSize >= 2 * segmentHeaderSize + size + MIHP_GetMinimalPayloadSize(heap)) - MIHP_SplitHeapSegment(heap, currentSegment, segmentHeaderSize + size, &targetSegment); - else if (currentSegment->SegmentSize >= segmentHeaderSize + size) - targetSegment = currentSegment; - else - continue; + if (!MIHP_SplitHeapSegment(heap, currentSegment, segmentHeaderSize + size, &targetSegment)) + { + if (currentSegment->SegmentSize >= segmentHeaderSize + size) + targetSegment = currentSegment; + else + continue; + } targetSegment->OccupiedSize = size; targetSegment->Checksum = MIHP_GenerateHeapSegmentChecksum(heap, targetSegment); @@ -274,15 +275,13 @@ void* MIHP_Reallocate(MIHP_Heap* heap, void* ptr, size_t newSize) segment->Checksum = MIHP_GenerateHeapSegmentChecksum(heap, segment); size_t alignedNewSize = MIHP_GetHeapAlignedSize(heap, newSize); - if (segment->SegmentSize > 2 * segmentHeaderSize + alignedNewSize + MIHP_GetMinimalPayloadSize(heap)) - { - size_t newSplitSegmentSize = segment->SegmentSize - segmentHeaderSize - alignedNewSize; + size_t newSplitSegmentSize = segment->SegmentSize - segmentHeaderSize - alignedNewSize; - MIHP_HeapSegmentHeader* newSpittedSegment = NULL; - MIHP_SplitHeapSegment(heap, segment, newSplitSegmentSize, &newSpittedSegment); - if (newSpittedSegment && newSpittedSegment->NextSegment) - MIHP_MergeHeapSegments(heap, newSpittedSegment, newSpittedSegment->NextSegment); // Try directly merging with the adjacent segment - } + MIHP_HeapSegmentHeader* newSpittedSegment = NULL; + MIHP_SplitHeapSegment(heap, segment, newSplitSegmentSize, &newSpittedSegment); + + if (newSpittedSegment && newSpittedSegment->NextSegment) + MIHP_MergeHeapSegments(heap, newSpittedSegment, newSpittedSegment->NextSegment); // Try directly merging with the adjacent segment MIHP_UnlockHeap(heap); return ptr; @@ -609,6 +608,8 @@ bool MIHP_SplitHeapSegment(MIHP_Heap* heap, MIHP_HeapSegmentHeader* sourceSegmen MIHP_ASSERT(sourceSegment); size_t headerSize = MIHP_GetHeapAlignedSize(heap, sizeof(MIHP_HeapSegmentHeader)); + newSegmentMinSize = MIHP_MAX(MIHP_GetMinimalPayloadSize(heap) + headerSize, newSegmentMinSize); + size_t effectiveNewSegmentSize = MIHP_GetHeapAlignedSize(heap, newSegmentMinSize); if (sourceSegment->SegmentSize < effectiveNewSegmentSize) @@ -616,6 +617,9 @@ bool MIHP_SplitHeapSegment(MIHP_Heap* heap, MIHP_HeapSegmentHeader* sourceSegmen size_t sourceResultingSegmentSize = sourceSegment->SegmentSize - effectiveNewSegmentSize; + if (sourceResultingSegmentSize < MIHP_GetMinimalPayloadSize(heap) + headerSize) + return false; + if (sourceResultingSegmentSize < sourceSegment->OccupiedSize + headerSize) return false; diff --git a/minimal_heap_test.c b/minimal_heap_test.c index 5eec170..3537976 100644 --- a/minimal_heap_test.c +++ b/minimal_heap_test.c @@ -26,7 +26,7 @@ void OnHeapCorruptionDetectedCallback(const MIHP_Heap* heap, MIHP_HeapCorruption __debugbreak(); } -#define NUM_ALLOCATIONS (4096 * 4096) +#define NUM_ALLOCATIONS (4096 * 4) void* myptrs[NUM_ALLOCATIONS] = { 0 }; @@ -38,14 +38,14 @@ int main() config.PlatformFreeMemoryFn = FreeMemory; config.OnHeapCorruptionDetectedFn = OnHeapCorruptionDetectedCallback; - config.HeapValidationMode = MIHP_HVM_None; + config.HeapValidationMode = MIHP_HVM_Checksum; MIHP_Heap myHeap = { 0 }; MIHP_InitializeHeap(&myHeap, config); for (int i = 0; i < NUM_ALLOCATIONS; i++) { - size_t size = 473 + (i % 5 == 0 ? 854 : 0); + size_t size = 565 + (i % 5 == 0 ? 854 : 0); #if USE_MALLOC myptrs[i] = malloc(size); #else