Skip to content

Commit 2d3cb4b

Browse files
pks-tgitster
authored andcommitted
reftable/stack: fix zero-sized allocation when there are no readers
Similar as the preceding commit, we may try to do a zero-sized allocation when reloading a reftable stack that ain't got any tables. It is implementation-defined whether malloc(3p) returns a NULL pointer in that case or a zero-sized object. In case it does return a NULL pointer though it causes us to think we have run into an out-of-memory situation, and thus we return an error. Fix this by only allocating arrays when they have at least one entry. Reported-by: Randall S. Becker <[email protected]> Signed-off-by: Patrick Steinhardt <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 5ab8352 commit 2d3cb4b

File tree

1 file changed

+14
-10
lines changed

1 file changed

+14
-10
lines changed

reftable/stack.c

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -254,28 +254,32 @@ static int reftable_stack_reload_once(struct reftable_stack *st,
254254
int reuse_open)
255255
{
256256
size_t cur_len = !st->merged ? 0 : st->merged->readers_len;
257-
struct reftable_reader **cur;
257+
struct reftable_reader **cur = NULL;
258258
struct reftable_reader **reused = NULL;
259-
struct reftable_reader **new_readers;
259+
struct reftable_reader **new_readers = NULL;
260260
size_t reused_len = 0, reused_alloc = 0, names_len;
261261
size_t new_readers_len = 0;
262262
struct reftable_merged_table *new_merged = NULL;
263263
struct strbuf table_path = STRBUF_INIT;
264264
int err = 0;
265265
size_t i;
266266

267-
cur = stack_copy_readers(st, cur_len);
268-
if (!cur) {
269-
err = REFTABLE_OUT_OF_MEMORY_ERROR;
270-
goto done;
267+
if (cur_len) {
268+
cur = stack_copy_readers(st, cur_len);
269+
if (!cur) {
270+
err = REFTABLE_OUT_OF_MEMORY_ERROR;
271+
goto done;
272+
}
271273
}
272274

273275
names_len = names_length(names);
274276

275-
new_readers = reftable_calloc(names_len, sizeof(*new_readers));
276-
if (!new_readers) {
277-
err = REFTABLE_OUT_OF_MEMORY_ERROR;
278-
goto done;
277+
if (names_len) {
278+
new_readers = reftable_calloc(names_len, sizeof(*new_readers));
279+
if (!new_readers) {
280+
err = REFTABLE_OUT_OF_MEMORY_ERROR;
281+
goto done;
282+
}
279283
}
280284

281285
while (*names) {

0 commit comments

Comments
 (0)