]> git.ipfire.org Git - thirdparty/git.git/commitdiff
t-reftable-basics: allow for `malloc` to be `#define`d
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Wed, 8 Jan 2025 16:00:05 +0000 (16:00 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 8 Jan 2025 17:41:52 +0000 (09:41 -0800)
As indicated by the `#undef malloc` line in `reftable/basics.h`, it is
quite common to use allocators other than the default one by defining
`malloc` constants and friends.

This pattern is used e.g. in Git for Windows, which uses the powerful
and performant `mimalloc` allocator.

Furthermore, in `reftable/basics.c` this `#undef malloc` is
_specifically_ disabled by virtue of defining the
`REFTABLE_ALLOW_BANNED_ALLOCATORS` constant before including
`reftable/basic.h`, to ensure that such a custom allocator is also used
in the reftable code.

However, in 8db127d43f5b (reftable: avoid leaks on realloc error,
2024-12-28) and in 2cca185e8517 (reftable: fix allocation count on
realloc error, 2024-12-28), `reftable_set_alloc()` function calls were
introduced that pass `malloc`, `realloc` and `free` function pointers as
parameters _after_ `reftable/basics.h` ensured that they were no longer
`#define`d. This would override the custom allocator and re-set it to
the default allocator provided by, say, libc or MSVCRT.

This causes problems because those calls happen after the initial
allocator has already been used to initialize an array, which is
subsequently resized using the overridden default `realloc()` allocator.

You cannot mix and match allocators like that, which leads to a
`STATUS_HEAP_CORRUPTION` (C0000374) on Windows, and when running this
unit test through shell and/or `prove` (which only support 7-bit status
codes), it surfaces as exit code 127.

It is actually unnecessary to use those function pointers to
`malloc`/`realloc`/`free`, though: The `reftable` code goes out of its
way to fall back to the initial allocator when passing `NULL` parameters
instead. So let's do that instead of causing heap corruptions.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Acked-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/unit-tests/t-reftable-basics.c

index 990dc1a2445ddd004a1db634ceb928ce8320e230..1d640b280f9f77d98b97b09021d9dba50fdb5e16 100644 (file)
@@ -157,13 +157,13 @@ int cmd_main(int argc UNUSED, const char *argv[] UNUSED)
 
                old_alloc = alloc;
                old_arr = arr;
-               reftable_set_alloc(malloc, realloc_stub, free);
+               reftable_set_alloc(NULL, realloc_stub, NULL);
                check(REFTABLE_ALLOC_GROW(arr, old_alloc + 1, alloc));
                check(arr == old_arr);
                check_uint(alloc, ==, old_alloc);
 
                old_alloc = alloc;
-               reftable_set_alloc(malloc, realloc, free);
+               reftable_set_alloc(NULL, NULL, NULL);
                check(!REFTABLE_ALLOC_GROW(arr, old_alloc + 1, alloc));
                check(arr != NULL);
                check_uint(alloc, >, old_alloc);
@@ -188,11 +188,11 @@ int cmd_main(int argc UNUSED, const char *argv[] UNUSED)
                arr[alloc - 1] = 42;
 
                old_alloc = alloc;
-               reftable_set_alloc(malloc, realloc_stub, free);
+               reftable_set_alloc(NULL, realloc_stub, NULL);
                REFTABLE_ALLOC_GROW_OR_NULL(arr, old_alloc + 1, alloc);
                check(arr == NULL);
                check_uint(alloc, ==, 0);
-               reftable_set_alloc(malloc, realloc, free);
+               reftable_set_alloc(NULL, NULL, NULL);
 
                reftable_free(arr);
        }