aboutsummaryrefslogtreecommitdiffstats
path: root/alloc.c
diff options
context:
space:
mode:
authorノウラ | Flare <nouraellm@gmail.com>2025-09-04 17:44:16 +0000
committerJunio C Hamano <gitster@pobox.com>2025-09-04 15:24:16 -0700
commit5e2feb5ca692c5c4d39b11e1ffa056911dd7dfd3 (patch)
treed7e20c6e964472582b3700f8aa3046d702df83a2 /alloc.c
parentThe fourth batch (diff)
downloadgit-5e2feb5ca692c5c4d39b11e1ffa056911dd7dfd3.tar.gz
git-5e2feb5ca692c5c4d39b11e1ffa056911dd7dfd3.zip
alloc: fix dangling pointer in alloc_state cleanup
All callers of clear_alloc_state() immediately free what they cleared, so currently it does not hurt anybody that the alloc_state is left in an unreusable state, but it is an error-prone API. Replace it with a new function that clears but in addition frees the structure, as well as NULLing the pointer that points at it and adjust existing callers. As it is a moral equivalent of FREE_AND_NULL(), except that what it frees has internal structure that needs to be cleaned, allow the helper to be called twice in a row, by making a call with a pointer to a pointer variable that already is NULLed. While at it, rename allocate_alloc_state() and name the new function alloc_state_free_and_null(), to follow more closely the function naming convention specified in the CodingGuidelines (namely, functions about S are named with S_ prefix and then verb). Signed-off-by: ノウラ | Flare <nouraellm@gmail.com> Helped-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'alloc.c')
-rw-r--r--alloc.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/alloc.c b/alloc.c
index 377e80f5dd..533a045c2a 100644
--- a/alloc.c
+++ b/alloc.c
@@ -36,19 +36,25 @@ struct alloc_state {
int slab_nr, slab_alloc;
};
-struct alloc_state *allocate_alloc_state(void)
+struct alloc_state *alloc_state_alloc(void)
{
return xcalloc(1, sizeof(struct alloc_state));
}
-void clear_alloc_state(struct alloc_state *s)
+void alloc_state_free_and_null(struct alloc_state **s_)
{
+ struct alloc_state *s = *s_;
+
+ if (!s)
+ return;
+
while (s->slab_nr > 0) {
s->slab_nr--;
free(s->slabs[s->slab_nr]);
}
FREE_AND_NULL(s->slabs);
+ FREE_AND_NULL(*s_);
}
static inline void *alloc_node(struct alloc_state *s, size_t node_size)