Skip to content

Commit 3151e6a

Browse files
committed
Merge branch 'ps/reftable-alloc-failures-zalloc-fix'
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
2 parents ff795a5 + d728289 commit 3151e6a

File tree

3 files changed

+31
-15
lines changed

3 files changed

+31
-15
lines changed

reftable/basics.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,20 @@ static void (*reftable_free_ptr)(void *);
1717

1818
void *reftable_malloc(size_t sz)
1919
{
20+
if (!sz)
21+
return NULL;
2022
if (reftable_malloc_ptr)
2123
return (*reftable_malloc_ptr)(sz);
2224
return malloc(sz);
2325
}
2426

2527
void *reftable_realloc(void *p, size_t sz)
2628
{
29+
if (!sz) {
30+
reftable_free(p);
31+
return NULL;
32+
}
33+
2734
if (reftable_realloc_ptr)
2835
return (*reftable_realloc_ptr)(p, sz);
2936
return realloc(p, sz);

reftable/merged.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -240,14 +240,16 @@ int merged_table_init_iter(struct reftable_merged_table *mt,
240240
struct reftable_iterator *it,
241241
uint8_t typ)
242242
{
243-
struct merged_subiter *subiters;
243+
struct merged_subiter *subiters = NULL;
244244
struct merged_iter *mi = NULL;
245245
int ret;
246246

247-
REFTABLE_CALLOC_ARRAY(subiters, mt->readers_len);
248-
if (!subiters) {
249-
ret = REFTABLE_OUT_OF_MEMORY_ERROR;
250-
goto out;
247+
if (mt->readers_len) {
248+
REFTABLE_CALLOC_ARRAY(subiters, mt->readers_len);
249+
if (!subiters) {
250+
ret = REFTABLE_OUT_OF_MEMORY_ERROR;
251+
goto out;
252+
}
251253
}
252254

253255
for (size_t i = 0; i < mt->readers_len; i++) {

reftable/stack.c

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -270,28 +270,32 @@ static int reftable_stack_reload_once(struct reftable_stack *st,
270270
int reuse_open)
271271
{
272272
size_t cur_len = !st->merged ? 0 : st->merged->readers_len;
273-
struct reftable_reader **cur;
273+
struct reftable_reader **cur = NULL;
274274
struct reftable_reader **reused = NULL;
275-
struct reftable_reader **new_readers;
275+
struct reftable_reader **new_readers = NULL;
276276
size_t reused_len = 0, reused_alloc = 0, names_len;
277277
size_t new_readers_len = 0;
278278
struct reftable_merged_table *new_merged = NULL;
279279
struct reftable_buf table_path = REFTABLE_BUF_INIT;
280280
int err = 0;
281281
size_t i;
282282

283-
cur = stack_copy_readers(st, cur_len);
284-
if (!cur) {
285-
err = REFTABLE_OUT_OF_MEMORY_ERROR;
286-
goto done;
283+
if (cur_len) {
284+
cur = stack_copy_readers(st, cur_len);
285+
if (!cur) {
286+
err = REFTABLE_OUT_OF_MEMORY_ERROR;
287+
goto done;
288+
}
287289
}
288290

289291
names_len = names_length(names);
290292

291-
new_readers = reftable_calloc(names_len, sizeof(*new_readers));
292-
if (!new_readers) {
293-
err = REFTABLE_OUT_OF_MEMORY_ERROR;
294-
goto done;
293+
if (names_len) {
294+
new_readers = reftable_calloc(names_len, sizeof(*new_readers));
295+
if (!new_readers) {
296+
err = REFTABLE_OUT_OF_MEMORY_ERROR;
297+
goto done;
298+
}
295299
}
296300

297301
while (*names) {
@@ -1627,6 +1631,9 @@ int reftable_stack_auto_compact(struct reftable_stack *st)
16271631
struct segment seg;
16281632
uint64_t *sizes;
16291633

1634+
if (st->merged->readers_len < 2)
1635+
return 0;
1636+
16301637
sizes = stack_table_sizes_for_compaction(st);
16311638
if (!sizes)
16321639
return REFTABLE_OUT_OF_MEMORY_ERROR;

0 commit comments

Comments
 (0)