reftable/block: handle allocation failures
Handle allocation failures in `block_writer_init()` and `block_reader_init()`. This requires us to bubble up error codes into `writer_reinit_block_writer()`. Adapt call sites accordingly. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
cd6a47167e
commit
2d5dbb37b2
@ -52,6 +52,8 @@ static int block_writer_register_restart(struct block_writer *w, int n,
|
||||
return -1;
|
||||
if (is_restart) {
|
||||
REFTABLE_ALLOC_GROW(w->restarts, w->restart_len + 1, w->restart_cap);
|
||||
if (!w->restarts)
|
||||
return REFTABLE_OUT_OF_MEMORY_ERROR;
|
||||
w->restarts[w->restart_len++] = w->next;
|
||||
}
|
||||
|
||||
@ -63,8 +65,8 @@ static int block_writer_register_restart(struct block_writer *w, int n,
|
||||
return 0;
|
||||
}
|
||||
|
||||
void block_writer_init(struct block_writer *bw, uint8_t typ, uint8_t *buf,
|
||||
uint32_t block_size, uint32_t header_off, int hash_size)
|
||||
int block_writer_init(struct block_writer *bw, uint8_t typ, uint8_t *buf,
|
||||
uint32_t block_size, uint32_t header_off, int hash_size)
|
||||
{
|
||||
bw->buf = buf;
|
||||
bw->hash_size = hash_size;
|
||||
@ -78,8 +80,12 @@ void block_writer_init(struct block_writer *bw, uint8_t typ, uint8_t *buf,
|
||||
bw->last_key.len = 0;
|
||||
if (!bw->zstream) {
|
||||
REFTABLE_CALLOC_ARRAY(bw->zstream, 1);
|
||||
if (!bw->zstream)
|
||||
return REFTABLE_OUT_OF_MEMORY_ERROR;
|
||||
deflateInit(bw->zstream, 9);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint8_t block_writer_type(struct block_writer *bw)
|
||||
@ -163,6 +169,10 @@ int block_writer_finish(struct block_writer *w)
|
||||
*/
|
||||
compressed_len = deflateBound(w->zstream, src_len);
|
||||
REFTABLE_ALLOC_GROW(w->compressed, compressed_len, w->compressed_cap);
|
||||
if (!w->compressed) {
|
||||
ret = REFTABLE_OUT_OF_MEMORY_ERROR;
|
||||
return ret;
|
||||
}
|
||||
|
||||
w->zstream->next_out = w->compressed;
|
||||
w->zstream->avail_out = compressed_len;
|
||||
@ -219,12 +229,21 @@ int block_reader_init(struct block_reader *br, struct reftable_block *block,
|
||||
/* Log blocks specify the *uncompressed* size in their header. */
|
||||
REFTABLE_ALLOC_GROW(br->uncompressed_data, sz,
|
||||
br->uncompressed_cap);
|
||||
if (!br->uncompressed_data) {
|
||||
err = REFTABLE_OUT_OF_MEMORY_ERROR;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Copy over the block header verbatim. It's not compressed. */
|
||||
memcpy(br->uncompressed_data, block->data, block_header_skip);
|
||||
|
||||
if (!br->zstream) {
|
||||
REFTABLE_CALLOC_ARRAY(br->zstream, 1);
|
||||
if (!br->zstream) {
|
||||
err = REFTABLE_OUT_OF_MEMORY_ERROR;
|
||||
goto done;
|
||||
}
|
||||
|
||||
err = inflateInit(br->zstream);
|
||||
} else {
|
||||
err = inflateReset(br->zstream);
|
||||
|
Reference in New Issue
Block a user