Skip to content

Fix memory leak of mmaplist_t->chunks and allocator mismatch#3479

Merged
ptitSeb merged 1 commit intoptitSeb:mainfrom
devarajabc:bububu
Feb 9, 2026
Merged

Fix memory leak of mmaplist_t->chunks and allocator mismatch#3479
ptitSeb merged 1 commit intoptitSeb:mainfrom
devarajabc:bububu

Conversation

@devarajabc
Copy link
Copy Markdown
Contributor

mmaplist_t->chunks (blocklist_t**) is a heap-allocated pointer array grown via box_realloc in MmaplistAddBlock/MmaplistAddNBlocks. The individual elements chunks[i] point into InternalMmap regions and are correctly freed by InternalMunmap, but the pointer array itself was never freed.

DelMmaplist(): add box_free(list->chunks) before box_free(list). This function is called at runtime from RemoveMapping (env.c) on dlclose/munmap, so the leak accumulates over the program lifetime.

fini_custommem_helper(): add box_free(head->chunks) before freeing the struct. Remove box_free(mmaplist) which was dead code — mmaplist was already set to NULL before the if(head) block. Also fix allocator mismatch: the struct is allocated via box_calloc in NewMmaplist() but was freed with raw free() instead of box_free().

Verified with valgrind on ARM64:
https://github.com/devarajabc/box64_test_cases/tree/main/003_mmaplist_chunks_leak

mmaplist_t->chunks (blocklist_t**) is a heap-allocated pointer array
grown via box_realloc in MmaplistAddBlock/MmaplistAddNBlocks. The
individual elements chunks[i] point into InternalMmap regions and are
correctly freed by InternalMunmap, but the pointer array itself was
never freed.

DelMmaplist(): add box_free(list->chunks) before box_free(list).
This function is called at runtime from RemoveMapping (env.c) on
dlclose/munmap, so the leak accumulates over the program lifetime.

fini_custommem_helper(): add box_free(head->chunks) before freeing
the struct. Remove box_free(mmaplist) which was dead code — mmaplist
was already set to NULL before the if(head) block. Also fix
allocator mismatch: the struct is allocated via box_calloc in
NewMmaplist() but was freed with raw free() instead of box_free().

Verified with valgrind on ARM64:
https://github.com/devarajabc/box64_test_cases/tree/main/003_mmaplist_chunks_leak
@ptitSeb
Copy link
Copy Markdown
Owner

ptitSeb commented Feb 9, 2026

Oh, nice find, thanks.

@ptitSeb ptitSeb merged commit 0b5c1fc into ptitSeb:main Feb 9, 2026
27 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants