diff options
-rw-r--r-- | epan/wmem/wmem_array.c | 27 | ||||
-rw-r--r-- | epan/wmem/wmem_array.h | 8 | ||||
-rw-r--r-- | epan/wmem/wmem_test.c | 10 |
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); } |