summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Herrmann <dh.herrmann@gmail.com>2013-11-30 11:31:59 +0100
committerDavid Herrmann <dh.herrmann@gmail.com>2013-11-30 12:13:16 +0100
commit875af16dbb9b4ed73d184b4fed428d3d131c3978 (patch)
tree6dbcca9bbecf6bc7affc28875e56dbbb35bd5cd7
parent5e28b615a3f878fb839ceb924f2116e98e10c212 (diff)
util: add greedy_realloc0()
Compared to greedy_realloc(), this sets all newly allocated memory to 0. As the old variant has been used a lot for string-handling, we avoid changing it as clearing memory is not needed there.
-rw-r--r--src/shared/util.c14
-rw-r--r--src/shared/util.h3
2 files changed, 17 insertions, 0 deletions
diff --git a/src/shared/util.c b/src/shared/util.c
index 38134ae52..9e0929b59 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -5804,6 +5804,20 @@ void* greedy_realloc(void **p, size_t *allocated, size_t need) {
return q;
}
+void* greedy_realloc0(void **p, size_t *allocated, size_t need) {
+ size_t prev = *allocated;
+ uint8_t *q;
+
+ q = greedy_realloc(p, allocated, need);
+ if (!q)
+ return NULL;
+
+ if (*allocated > prev)
+ memset(&q[prev], 0, *allocated - prev);
+
+ return q;
+}
+
bool id128_is_valid(const char *s) {
size_t i, l;
diff --git a/src/shared/util.h b/src/shared/util.h
index 1662bd445..504f63a28 100644
--- a/src/shared/util.h
+++ b/src/shared/util.h
@@ -669,8 +669,11 @@ char *strextend(char **x, ...) _sentinel_;
char *strrep(const char *s, unsigned n);
void* greedy_realloc(void **p, size_t *allocated, size_t need);
+void* greedy_realloc0(void **p, size_t *allocated, size_t need);
#define GREEDY_REALLOC(array, allocated, need) \
greedy_realloc((void**) &(array), &(allocated), sizeof((array)[0]) * (need))
+#define GREEDY_REALLOC0(array, allocated, need) \
+ greedy_realloc0((void**) &(array), &(allocated), sizeof((array)[0]) * (need))
static inline void _reset_errno_(int *saved_errno) {
errno = *saved_errno;