aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--epan/wmem/wmem_array.c27
-rw-r--r--epan/wmem/wmem_array.h8
-rw-r--r--epan/wmem/wmem_test.c10
3 files changed, 45 insertions, 0 deletions
diff --git a/epan/wmem/wmem_array.c b/epan/wmem/wmem_array.c
index b4088fb051..6ac45989b2 100644
--- a/epan/wmem/wmem_array.c
+++ b/epan/wmem/wmem_array.c
@@ -45,6 +45,8 @@ struct _wmem_array_t {
guint elem_count;
guint alloc_count;
+
+ gboolean null_terminated;
};
wmem_array_t *
@@ -59,6 +61,7 @@ wmem_array_sized_new(wmem_allocator_t *allocator, gsize elem_size,
array->elem_size = elem_size;
array->elem_count = 0;
array->alloc_count = alloc_count ? alloc_count : 1;
+ array->null_terminated = FALSE;
array->buf = (guint8 *)wmem_alloc(array->allocator,
array->elem_size * array->alloc_count);
@@ -98,6 +101,28 @@ wmem_array_grow(wmem_array_t *array, const guint to_add)
array->alloc_count = new_alloc_count;
}
+static void
+wmem_array_write_null_terminator(wmem_array_t *array)
+{
+ if (array->null_terminated) {
+ wmem_array_grow(array, 1);
+ memset(&array->buf[array->elem_count * array->elem_size], 0x0, array->elem_size);
+ }
+}
+
+void
+wmem_array_set_null_terminator(wmem_array_t *array)
+{
+ array->null_terminated = TRUE;
+ wmem_array_write_null_terminator(array);
+}
+
+void
+wmem_array_bzero(wmem_array_t *array)
+{
+ memset(array->buf, 0x0, array->elem_size * array->elem_count);
+}
+
void
wmem_array_append(wmem_array_t *array, const void *in, guint count)
{
@@ -107,6 +132,8 @@ wmem_array_append(wmem_array_t *array, const void *in, guint count)
count * array->elem_size);
array->elem_count += count;
+
+ wmem_array_write_null_terminator(array);
}
void *
diff --git a/epan/wmem/wmem_array.h b/epan/wmem/wmem_array.h
index 2c5481950b..30738d696d 100644
--- a/epan/wmem/wmem_array.h
+++ b/epan/wmem/wmem_array.h
@@ -59,6 +59,14 @@ G_GNUC_MALLOC;
WS_DLL_PUBLIC
void
+wmem_array_set_null_terminator(wmem_array_t *array);
+
+WS_DLL_PUBLIC
+void
+wmem_array_bzero(wmem_array_t *array);
+
+WS_DLL_PUBLIC
+void
wmem_array_append(wmem_array_t *array, const void *in, guint count);
#define wmem_array_append_one(ARRAY, VAL) \
diff --git a/epan/wmem/wmem_test.c b/epan/wmem/wmem_test.c
index f57ae5ee78..b9da385181 100644
--- a/epan/wmem/wmem_test.c
+++ b/epan/wmem/wmem_test.c
@@ -475,6 +475,8 @@ wmem_test_array(void)
unsigned int i, j, k;
guint32 val, *buf;
guint32 vals[8];
+ guint32 *raw;
+ guint32 lastint;
allocator = wmem_allocator_new(WMEM_ALLOCATOR_STRICT);
@@ -498,6 +500,7 @@ wmem_test_array(void)
}
array = wmem_array_sized_new(allocator, sizeof(guint32), 73);
+ wmem_array_set_null_terminator(array);
for (i=0; i<CONTAINER_ITERS; i++) {
for (j=0; j<8; j++) {
@@ -535,6 +538,13 @@ wmem_test_array(void)
}
g_assert(k == wmem_array_get_count(array));
+ lastint = 77;
+ wmem_array_append_one(array, lastint);
+
+ raw = (guint32*)wmem_array_get_raw(array);
+ g_assert(raw[wmem_array_get_count(array)] == 0);
+ g_assert(raw[wmem_array_get_count(array) - 1] == lastint);
+
wmem_destroy_allocator(allocator);
}