From 37acf433dbb2ef1d443c9ee09a315b0b4ce136d8 Mon Sep 17 00:00:00 2001 From: Dario Lombardo Date: Thu, 18 Feb 2016 11:32:07 +0100 Subject: wmem: add null-terminator support. This change makes wmem_array more similar to GArray by adding two functions that mimic the first two params of g_array_new(). Change-Id: Iaec999cd2e44f79f44d766be5d39741b73602e5a Reviewed-on: https://code.wireshark.org/review/13989 Petri-Dish: Evan Huus Tested-by: Petri Dish Buildbot Reviewed-by: Evan Huus --- epan/wmem/wmem_array.c | 27 +++++++++++++++++++++++++++ epan/wmem/wmem_array.h | 8 ++++++++ epan/wmem/wmem_test.c | 10 ++++++++++ 3 files changed, 45 insertions(+) (limited to 'epan/wmem') 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 @@ -57,6 +57,14 @@ wmem_array_t * wmem_array_new(wmem_allocator_t *allocator, const gsize elem_size) 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); 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