From 24d4d38c0b32fd4eb075af89d7b744c5647db5c2 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Thu, 20 Jan 2022 15:12:01 +0000 Subject: reftable: fix resource leak in block.c error path Add test coverage for corrupt zlib data. Fix memory leaks demonstrated by unittest. This problem was discovered by a Coverity scan. Signed-off-by: Han-Wen Nienhuys Signed-off-by: Junio C Hamano --- reftable/reader.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) (limited to 'reftable/reader.c') diff --git a/reftable/reader.c b/reftable/reader.c index 006709a645..35781593a2 100644 --- a/reftable/reader.c +++ b/reftable/reader.c @@ -290,28 +290,33 @@ int reader_init_block_reader(struct reftable_reader *r, struct block_reader *br, err = reader_get_block(r, &block, next_off, guess_block_size); if (err < 0) - return err; + goto done; block_size = extract_block_size(block.data, &block_typ, next_off, r->version); - if (block_size < 0) - return block_size; - + if (block_size < 0) { + err = block_size; + goto done; + } if (want_typ != BLOCK_TYPE_ANY && block_typ != want_typ) { - reftable_block_done(&block); - return 1; + err = 1; + goto done; } if (block_size > guess_block_size) { reftable_block_done(&block); err = reader_get_block(r, &block, next_off, block_size); if (err < 0) { - return err; + goto done; } } - return block_reader_init(br, &block, header_off, r->block_size, - hash_size(r->hash_id)); + err = block_reader_init(br, &block, header_off, r->block_size, + hash_size(r->hash_id)); +done: + reftable_block_done(&block); + + return err; } static int table_iter_next_block(struct table_iter *dest, -- cgit v1.3-5-g9baa