mirror of
https://github.com/git/git
synced 2024-11-05 01:58:18 +00:00
reftable/blocksource: handle allocation failures
Handle allocation failures in the blocksource code. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
cc6a9af5d7
commit
cd6a47167e
1 changed files with 20 additions and 5 deletions
|
@ -30,6 +30,8 @@ static int strbuf_read_block(void *v, struct reftable_block *dest, uint64_t off,
|
|||
struct strbuf *b = v;
|
||||
assert(off + size <= b->len);
|
||||
REFTABLE_CALLOC_ARRAY(dest->data, size);
|
||||
if (!dest->data)
|
||||
return -1;
|
||||
memcpy(dest->data, b->buf + off, size);
|
||||
dest->len = size;
|
||||
return size;
|
||||
|
@ -98,27 +100,40 @@ int reftable_block_source_from_file(struct reftable_block_source *bs,
|
|||
{
|
||||
struct file_block_source *p;
|
||||
struct stat st;
|
||||
int fd;
|
||||
int fd, err;
|
||||
|
||||
fd = open(name, O_RDONLY);
|
||||
if (fd < 0) {
|
||||
if (errno == ENOENT)
|
||||
return REFTABLE_NOT_EXIST_ERROR;
|
||||
return -1;
|
||||
err = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (fstat(fd, &st) < 0) {
|
||||
close(fd);
|
||||
return REFTABLE_IO_ERROR;
|
||||
err = REFTABLE_IO_ERROR;
|
||||
goto out;
|
||||
}
|
||||
|
||||
REFTABLE_CALLOC_ARRAY(p, 1);
|
||||
if (!p) {
|
||||
err = REFTABLE_OUT_OF_MEMORY_ERROR;
|
||||
goto out;
|
||||
}
|
||||
|
||||
p->size = st.st_size;
|
||||
p->data = xmmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
|
||||
close(fd);
|
||||
|
||||
assert(!bs->ops);
|
||||
bs->ops = &file_vtable;
|
||||
bs->arg = p;
|
||||
|
||||
err = 0;
|
||||
|
||||
out:
|
||||
if (fd >= 0)
|
||||
close(fd);
|
||||
if (err < 0)
|
||||
reftable_free(p);
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue