Merge branch 'ne/alloc-free-and-null'
The clear_alloc_state() API function was not fully clearing the structure for reuse, but since nobody reuses it, replace it with a variant that frees the structure as well, making the callers simpler. * ne/alloc-free-and-null: alloc: fix dangling pointer in alloc_state cleanup
This commit is contained in:
10
alloc.c
10
alloc.c
@@ -36,19 +36,25 @@ struct alloc_state {
|
|||||||
int slab_nr, slab_alloc;
|
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));
|
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) {
|
while (s->slab_nr > 0) {
|
||||||
s->slab_nr--;
|
s->slab_nr--;
|
||||||
free(s->slabs[s->slab_nr]);
|
free(s->slabs[s->slab_nr]);
|
||||||
}
|
}
|
||||||
|
|
||||||
FREE_AND_NULL(s->slabs);
|
FREE_AND_NULL(s->slabs);
|
||||||
|
FREE_AND_NULL(*s_);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void *alloc_node(struct alloc_state *s, size_t node_size)
|
static inline void *alloc_node(struct alloc_state *s, size_t node_size)
|
||||||
|
|||||||
4
alloc.h
4
alloc.h
@@ -14,7 +14,7 @@ void *alloc_commit_node(struct repository *r);
|
|||||||
void *alloc_tag_node(struct repository *r);
|
void *alloc_tag_node(struct repository *r);
|
||||||
void *alloc_object_node(struct repository *r);
|
void *alloc_object_node(struct repository *r);
|
||||||
|
|
||||||
struct alloc_state *allocate_alloc_state(void);
|
struct alloc_state *alloc_state_alloc(void);
|
||||||
void clear_alloc_state(struct alloc_state *s);
|
void alloc_state_free_and_null(struct alloc_state **s_);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
26
object.c
26
object.c
@@ -517,12 +517,11 @@ struct parsed_object_pool *parsed_object_pool_new(struct repository *repo)
|
|||||||
memset(o, 0, sizeof(*o));
|
memset(o, 0, sizeof(*o));
|
||||||
|
|
||||||
o->repo = repo;
|
o->repo = repo;
|
||||||
o->blob_state = allocate_alloc_state();
|
o->blob_state = alloc_state_alloc();
|
||||||
o->tree_state = allocate_alloc_state();
|
o->tree_state = alloc_state_alloc();
|
||||||
o->commit_state = allocate_alloc_state();
|
o->commit_state = alloc_state_alloc();
|
||||||
o->tag_state = allocate_alloc_state();
|
o->tag_state = alloc_state_alloc();
|
||||||
o->object_state = allocate_alloc_state();
|
o->object_state = alloc_state_alloc();
|
||||||
|
|
||||||
o->is_shallow = -1;
|
o->is_shallow = -1;
|
||||||
CALLOC_ARRAY(o->shallow_stat, 1);
|
CALLOC_ARRAY(o->shallow_stat, 1);
|
||||||
|
|
||||||
@@ -573,16 +572,11 @@ void parsed_object_pool_clear(struct parsed_object_pool *o)
|
|||||||
o->buffer_slab = NULL;
|
o->buffer_slab = NULL;
|
||||||
|
|
||||||
parsed_object_pool_reset_commit_grafts(o);
|
parsed_object_pool_reset_commit_grafts(o);
|
||||||
clear_alloc_state(o->blob_state);
|
alloc_state_free_and_null(&o->blob_state);
|
||||||
clear_alloc_state(o->tree_state);
|
alloc_state_free_and_null(&o->tree_state);
|
||||||
clear_alloc_state(o->commit_state);
|
alloc_state_free_and_null(&o->commit_state);
|
||||||
clear_alloc_state(o->tag_state);
|
alloc_state_free_and_null(&o->tag_state);
|
||||||
clear_alloc_state(o->object_state);
|
alloc_state_free_and_null(&o->object_state);
|
||||||
stat_validity_clear(o->shallow_stat);
|
stat_validity_clear(o->shallow_stat);
|
||||||
FREE_AND_NULL(o->blob_state);
|
|
||||||
FREE_AND_NULL(o->tree_state);
|
|
||||||
FREE_AND_NULL(o->commit_state);
|
|
||||||
FREE_AND_NULL(o->tag_state);
|
|
||||||
FREE_AND_NULL(o->object_state);
|
|
||||||
FREE_AND_NULL(o->shallow_stat);
|
FREE_AND_NULL(o->shallow_stat);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user