Skip to content

Commit

Permalink
Merge branch 'ps/reftable-alloc-failures-zalloc-fix'
Browse files Browse the repository at this point in the history
Recent reftable updates mistook a NULL return from a request for
0-byte allocation as OOM and died unnecessarily, which has been
corrected.

* ps/reftable-alloc-failures-zalloc-fix:
  reftable/basics: return NULL on zero-sized allocations
  reftable/stack: fix zero-sized allocation when there are no readers
  reftable/merged: fix zero-sized allocation when there are no readers
  reftable/stack: don't perform auto-compaction with less than two tables
  • Loading branch information
gitster committed Dec 23, 2024
2 parents ff795a5 + d728289 commit 3151e6a
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 15 deletions.
7 changes: 7 additions & 0 deletions reftable/basics.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,20 @@ 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);
}

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);
Expand Down
12 changes: 7 additions & 5 deletions reftable/merged.c
Original file line number Diff line number Diff line change
Expand Up @@ -240,14 +240,16 @@ int merged_table_init_iter(struct reftable_merged_table *mt,
struct reftable_iterator *it,
uint8_t typ)
{
struct merged_subiter *subiters;
struct merged_subiter *subiters = NULL;
struct merged_iter *mi = NULL;
int ret;

REFTABLE_CALLOC_ARRAY(subiters, mt->readers_len);
if (!subiters) {
ret = REFTABLE_OUT_OF_MEMORY_ERROR;
goto out;
if (mt->readers_len) {
REFTABLE_CALLOC_ARRAY(subiters, mt->readers_len);
if (!subiters) {
ret = REFTABLE_OUT_OF_MEMORY_ERROR;
goto out;
}
}

for (size_t i = 0; i < mt->readers_len; i++) {
Expand Down
27 changes: 17 additions & 10 deletions reftable/stack.c
Original file line number Diff line number Diff line change
Expand Up @@ -270,28 +270,32 @@ static int reftable_stack_reload_once(struct reftable_stack *st,
int reuse_open)
{
size_t cur_len = !st->merged ? 0 : st->merged->readers_len;
struct reftable_reader **cur;
struct reftable_reader **cur = NULL;
struct reftable_reader **reused = NULL;
struct reftable_reader **new_readers;
struct reftable_reader **new_readers = NULL;
size_t reused_len = 0, reused_alloc = 0, names_len;
size_t new_readers_len = 0;
struct reftable_merged_table *new_merged = NULL;
struct reftable_buf table_path = REFTABLE_BUF_INIT;
int err = 0;
size_t i;

cur = stack_copy_readers(st, cur_len);
if (!cur) {
err = REFTABLE_OUT_OF_MEMORY_ERROR;
goto done;
if (cur_len) {
cur = stack_copy_readers(st, cur_len);
if (!cur) {
err = REFTABLE_OUT_OF_MEMORY_ERROR;
goto done;
}
}

names_len = names_length(names);

new_readers = reftable_calloc(names_len, sizeof(*new_readers));
if (!new_readers) {
err = REFTABLE_OUT_OF_MEMORY_ERROR;
goto done;
if (names_len) {
new_readers = reftable_calloc(names_len, sizeof(*new_readers));
if (!new_readers) {
err = REFTABLE_OUT_OF_MEMORY_ERROR;
goto done;
}
}

while (*names) {
Expand Down Expand Up @@ -1627,6 +1631,9 @@ int reftable_stack_auto_compact(struct reftable_stack *st)
struct segment seg;
uint64_t *sizes;

if (st->merged->readers_len < 2)
return 0;

sizes = stack_table_sizes_for_compaction(st);
if (!sizes)
return REFTABLE_OUT_OF_MEMORY_ERROR;
Expand Down

0 comments on commit 3151e6a

Please sign in to comment.