summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLouis Burda <quent.burda@gmail.com>2023-03-13 12:59:36 +0100
committerLouis Burda <quent.burda@gmail.com>2023-03-13 12:59:53 +0100
commit78cdbdf01dfca7700db07caec49067eb44b09721 (patch)
tree8ce1319a68d84108810c92e665e705f89a3bbe7e /src
parent6431e7434c0b935c5825322d286d5721f1782d32 (diff)
downloadlibbitvec-c-78cdbdf01dfca7700db07caec49067eb44b09721.tar.gz
libbitvec-c-78cdbdf01dfca7700db07caec49067eb44b09721.zip
Prevent memory leak when realloc fails
Diffstat (limited to 'src')
-rw-r--r--src/bitvec.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/bitvec.c b/src/bitvec.c
index 1015c26..72bb23d 100644
--- a/src/bitvec.c
+++ b/src/bitvec.c
@@ -73,17 +73,19 @@ bitvec_free(struct bitvec *vec)
bool
bitvec_reserve(struct bitvec *vec, size_t cnt)
{
+ void *alloc;
+
LIBBITVEC_ASSERT(vec != NULL);
cnt = BITCEIL(cnt);
if (vec->cap >= cnt) return true;
- vec->data = realloc(vec->data, SLOTCNT(cnt) * SLOT_BYTES);
- if (!vec->data) {
+ alloc = realloc(vec->data, SLOTCNT(cnt) * SLOT_BYTES);
+ if (!alloc) {
LIBBITVEC_HANDLE_ERR("realloc");
return false;
}
-
+ alloc = vec->data;
memset(vec->data + SLOT(vec->cap), 0, SLOT(cnt) - SLOT(vec->cap));
vec->cap = cnt;
@@ -93,17 +95,18 @@ bitvec_reserve(struct bitvec *vec, size_t cnt)
bool
bitvec_shrink(struct bitvec *vec, size_t cnt)
{
+ void *alloc;
LIBBITVEC_ASSERT(vec != NULL);
cnt = BITCEIL(cnt);
if (vec->cap <= cnt) return true;
- vec->data = realloc(vec->data, SLOTCNT(cnt));
- if (!vec->data) {
+ alloc = realloc(vec->data, SLOTCNT(cnt));
+ if (!alloc) {
LIBBITVEC_HANDLE_ERR("realloc");
return false;
}
-
+ vec->data = alloc;
vec->cap = cnt;
return true;