aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2016-04-27 00:43:30 +0200
committerMattias Andrée <maandree@kth.se>2016-04-27 00:43:30 +0200
commit54a9d9a38a6fd9c4ee7c508a168c1f78391644cb (patch)
tree391c61cc6537a90bf29bca0a9cde31de014db546
parentzstr: add new parameter, n: the known limit out the length of the output (diff)
downloadlibzahl-54a9d9a38a6fd9c4ee7c508a168c1f78391644cb.tar.gz
libzahl-54a9d9a38a6fd9c4ee7c508a168c1f78391644cb.tar.bz2
libzahl-54a9d9a38a6fd9c4ee7c508a168c1f78391644cb.tar.xz
Fix possible memory in zstr on failure
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to '')
-rw-r--r--src/internals.h3
-rw-r--r--src/zsetup.c1
-rw-r--r--src/zstr.c3
3 files changed, 6 insertions, 1 deletions
diff --git a/src/internals.h b/src/internals.h
index 40dd74d..225d64c 100644
--- 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
index 212a1e9..aebef32 100644
--- 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
index 308c7ef..6a577b9 100644
--- 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;
}