return chunks split off by memalign using __bin_chunk instead of free
authorRich Felker <dalias@aerifal.cx>
Fri, 20 Apr 2018 00:56:26 +0000 (20:56 -0400)
committerRich Felker <dalias@aerifal.cx>
Fri, 20 Apr 2018 00:56:26 +0000 (20:56 -0400)
this change serves multiple purposes:

1. it ensures that static linking of memalign-family functions will
pull in the system malloc implementation, thereby causing link errors
if an attempt is made to link the system memalign functions with a
replacement malloc (incomplete allocator replacement).

2. it eliminates calls to free that are unpaired with allocations,
which are confusing when setting breakpoints or tracing execution.

as a bonus, making __bin_chunk external may discourage aggressive and
unnecessary inlining of it.

src/internal/malloc_impl.h
src/malloc/malloc.c
src/malloc/memalign.c

index 1ea0407c992a3731a7446a8f582ac42f8e25c636..4c4a4b461519863c59f6be01740e9585da214881 100644 (file)
@@ -36,4 +36,7 @@ struct bin {
 
 #define IS_MMAPPED(c) !((c)->csize & (C_INUSE))
 
+__attribute__((__visibility__("hidden")))
+void __bin_chunk(struct chunk *);
+
 #endif
index c8bc9227c6a5bbc5f88920d9abfd4d6bc186f1ce..239ab9c6ba2cdf159ef041c41b3eba7d01b87d93 100644 (file)
@@ -263,8 +263,6 @@ static int pretrim(struct chunk *self, size_t n, int i, int j)
        return 1;
 }
 
-static void bin_chunk(struct chunk *);
-
 static void trim(struct chunk *self, size_t n)
 {
        size_t n1 = CHUNK_SIZE(self);
@@ -280,7 +278,7 @@ static void trim(struct chunk *self, size_t n)
        next->psize = n1-n | C_INUSE;
        self->csize = n | C_INUSE;
 
-       bin_chunk(split);
+       __bin_chunk(split);
 }
 
 void *malloc(size_t n)
@@ -436,7 +434,7 @@ copy_free_ret:
        return new;
 }
 
-static void bin_chunk(struct chunk *self)
+void __bin_chunk(struct chunk *self)
 {
        struct chunk *next = NEXT_CHUNK(self);
        size_t final_size, new_size, size;
@@ -524,7 +522,7 @@ void free(void *p)
        if (IS_MMAPPED(self))
                unmap_chunk(self);
        else
-               bin_chunk(self);
+               __bin_chunk(self);
 }
 
 void __malloc_donate(char *start, char *end)
@@ -543,5 +541,5 @@ void __malloc_donate(char *start, char *end)
        struct chunk *c = MEM_TO_CHUNK(start), *n = MEM_TO_CHUNK(end);
        c->psize = n->csize = C_INUSE;
        c->csize = n->psize = C_INUSE | (end-start);
-       bin_chunk(c);
+       __bin_chunk(c);
 }
index 9c420229be823007ac22bebaf3dea8d0082149ce..7246a99b808a27cea8d758ec35df83392e09009a 100644 (file)
@@ -48,7 +48,7 @@ void *__memalign(size_t align, size_t len)
        n->psize = c->csize = C_INUSE | (new-mem);
        n->csize = t->psize -= new-mem;
 
-       free(mem);
+       __bin_chunk(c);
        return new;
 }