libzahl

big integer library
git clone git://git.suckless.org/libzahl
Log | Files | Refs | README | LICENSE

commit 54a9d9a38a6fd9c4ee7c508a168c1f78391644cb
parent eb13267f82e848d9a9b38a2791e5c7008bf8d157
Author: Mattias Andrée <maandree@kth.se>
Date:   Wed, 27 Apr 2016 00:43:30 +0200

Fix possible memory in zstr on failure

Signed-off-by: Mattias Andrée <maandree@kth.se>

Diffstat:
Msrc/internals.h | 3+++
Msrc/zsetup.c | 1+
Msrc/zstr.c | 3++-
3 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/internals.h b/src/internals.h @@ -92,6 +92,7 @@ extern size_t libzahl_pool_alloc[sizeof(size_t) * 8]; extern struct zahl **libzahl_temp_stack; extern struct zahl **libzahl_temp_stack_head; extern struct zahl **libzahl_temp_stack_end; +extern void *libzahl_temp_allocation; #define likely(expr) ZAHL_LIKELY(expr) #define unlikely(expr) ZAHL_UNLIKELY(expr) @@ -131,6 +132,8 @@ libzahl_failure(int error) if (libzahl_temp_stack) while (libzahl_temp_stack_head != libzahl_temp_stack) zfree(*--libzahl_temp_stack_head); + free(libzahl_temp_allocation); + libzahl_temp_allocation = 0; longjmp(libzahl_jmp_buf, 1); } diff --git a/src/zsetup.c b/src/zsetup.c @@ -18,6 +18,7 @@ size_t libzahl_pool_alloc[sizeof(size_t) * 8]; struct zahl **libzahl_temp_stack; struct zahl **libzahl_temp_stack_head; struct zahl **libzahl_temp_stack_end; +void *libzahl_temp_allocation = 0; void diff --git a/src/zstr.c b/src/zstr.c @@ -81,7 +81,7 @@ zstr(z_t a, char *b, size_t n) n = zstr_length(a, 10); } - if (unlikely(!b) && unlikely(!(b = malloc(n + 1)))) + if (unlikely(!b) && unlikely(!(b = libzahl_temp_allocation = malloc(n + 1)))) libzahl_memfailure(); neg = znegative(a); @@ -111,5 +111,6 @@ zstr(z_t a, char *b, size_t n) } } + libzahl_temp_allocation = 0; return b - neg; }