]> git.ipfire.org Git - thirdparty/git.git/commitdiff
reftable/basics: return NULL on zero-sized allocations
authorPatrick Steinhardt <ps@pks.im>
Sun, 22 Dec 2024 07:24:31 +0000 (08:24 +0100)
committerJunio C Hamano <gitster@pobox.com>
Sun, 22 Dec 2024 08:58:23 +0000 (00:58 -0800)
In the preceding commits we have fixed a couple of issues when
allocating zero-sized objects. These issues were masked by
implementation-defined behaviour. Quoting malloc(3p):

  If size is 0, either:

    * A null pointer shall be returned and errno may be set to an
      implementation-defined value, or

    * A pointer to the allocated space shall be returned. The
      application shall ensure that the pointer is not used to access an
      object.

So it is perfectly valid that implementations of this function may or
may not return a NULL pointer in such a case.

Adapt both `reftable_malloc()` and `reftable_realloc()` so that they
return NULL pointers on zero-sized allocations. This should remove any
implementation-defined behaviour in our allocators and thus allows us to
detect such platform-specific issues more easily going forward.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
reftable/basics.c

index 9a949e5cf8085c74b447073d1c54d00f9496594d..eab5553d934a83e8072a375e7b7f919fe3c9af80 100644 (file)
@@ -16,6 +16,8 @@ static void (*reftable_free_ptr)(void *);
 
 void *reftable_malloc(size_t sz)
 {
+       if (!sz)
+               return NULL;
        if (reftable_malloc_ptr)
                return (*reftable_malloc_ptr)(sz);
        return malloc(sz);
@@ -23,6 +25,11 @@ void *reftable_malloc(size_t sz)
 
 void *reftable_realloc(void *p, size_t sz)
 {
+       if (!sz) {
+               reftable_free(p);
+               return NULL;
+       }
+
        if (reftable_realloc_ptr)
                return (*reftable_realloc_ptr)(p, sz);
        return realloc(p, sz);