summaryrefslogtreecommitdiff
path: root/epan/tvbtest.c
diff options
context:
space:
mode:
authorBill Meier <wmeier@newsguy.com>2011-12-21 21:40:25 +0000
committerBill Meier <wmeier@newsguy.com>2011-12-21 21:40:25 +0000
commit522950401f468bfb8a7b4079540c78d0f3c06452 (patch)
treed88d632ff9749b50ae26e6985faadff33dee8192 /epan/tvbtest.c
parent796847fdc7587615028d8f93c6e9590b9dd8642d (diff)
downloadwireshark-522950401f468bfb8a7b4079540c78d0f3c06452.tar.gz
Add code to allow tvbuff memory leak testing (using valgrind, for example).
Essentially: tvbtest.c patch from Robert G. Jakabosky: https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=6573 Also: Update tvbtest code slightly to reflect the revised tvbuffs code committed in SVN #40264; (Composite tvbs should not be individually freed). svn path=/trunk/; revision=40267
Diffstat (limited to 'epan/tvbtest.c')
-rw-r--r--epan/tvbtest.c34
1 files changed, 26 insertions, 8 deletions
diff --git a/epan/tvbtest.c b/epan/tvbtest.c
index 0a7c40eb7c..77a976ca66 100644
--- a/epan/tvbtest.c
+++ b/epan/tvbtest.c
@@ -42,7 +42,6 @@ test(tvbuff_t *tvb, gchar* name,
guint8* expected_data, guint expected_length)
{
guint length;
- const guint8 *cptr;
guint8 *ptr;
volatile gboolean ex_thrown;
volatile guint32 val32;
@@ -61,7 +60,7 @@ test(tvbuff_t *tvb, gchar* name,
/* Test boundary case. A BoundsError exception should be thrown. */
ex_thrown = FALSE;
TRY {
- cptr = tvb_get_ptr(tvb, 0, length + 1);
+ tvb_get_ptr(tvb, 0, length + 1);
}
CATCH(BoundsError) {
ex_thrown = TRUE;
@@ -82,7 +81,7 @@ test(tvbuff_t *tvb, gchar* name,
exception should be thrown. */
ex_thrown = FALSE;
TRY {
- cptr = tvb_get_ptr(tvb, 0, length + 2);
+ tvb_get_ptr(tvb, 0, length + 2);
}
CATCH(BoundsError) {
printf("03: Caught wrong exception: BoundsError\n");
@@ -102,7 +101,7 @@ test(tvbuff_t *tvb, gchar* name,
/* Test boundary case. A BoundsError exception should be thrown. */
ex_thrown = FALSE;
TRY {
- cptr = tvb_get_ptr(tvb, -1, 2);
+ tvb_get_ptr(tvb, -1, 2);
}
CATCH(BoundsError) {
ex_thrown = TRUE;
@@ -122,7 +121,7 @@ test(tvbuff_t *tvb, gchar* name,
/* Test boundary case. A BoundsError exception should not be thrown. */
ex_thrown = FALSE;
TRY {
- cptr = tvb_get_ptr(tvb, 0, 1);
+ tvb_get_ptr(tvb, 0, 1);
}
CATCH(BoundsError) {
ex_thrown = TRUE;
@@ -142,7 +141,7 @@ test(tvbuff_t *tvb, gchar* name,
/* Test boundary case. A BoundsError exception should not be thrown. */
ex_thrown = FALSE;
TRY {
- cptr = tvb_get_ptr(tvb, -1, 1);
+ tvb_get_ptr(tvb, -1, 1);
}
CATCH(BoundsError) {
ex_thrown = TRUE;
@@ -262,6 +261,7 @@ run_tests(void)
{
int i, j;
+ tvbuff_t *tvb_parent;
tvbuff_t *tvb_small[3];
tvbuff_t *tvb_large[3];
tvbuff_t *tvb_subset[6];
@@ -275,6 +275,7 @@ run_tests(void)
guint comp_length[6];
int len;
+ tvb_parent = tvb_new_real_data("", 0, 0);
for (i = 0; i < 3; i++) {
small[i] = g_new(guint8, 16);
@@ -283,7 +284,8 @@ run_tests(void)
small[i][j] = temp + j;
}
- tvb_small[i] = tvb_new_real_data(small[i], 16, 17);
+ tvb_small[i] = tvb_new_child_real_data(tvb_parent, small[i], 16, 17);
+ tvb_set_free_cb(tvb_small[i], g_free);
}
for (i = 0; i < 3; i++) {
@@ -294,7 +296,8 @@ run_tests(void)
large[i][j] = temp + j;
}
- tvb_large[i] = tvb_new_real_data(large[i], 19, 20);
+ tvb_large[i] = tvb_new_child_real_data(tvb_parent, large[i], 19, 20);
+ tvb_set_free_cb(tvb_large[i], g_free);
}
/* Test the TVBUFF_REAL_DATA objects. */
@@ -421,11 +424,26 @@ run_tests(void)
skip(tvb_comp[3], "Composite 3", comp[3], comp_length[3]);
skip(tvb_comp[4], "Composite 4", comp[4], comp_length[4]);
skip(tvb_comp[5], "Composite 5", comp[5], comp_length[5]);
+
+ /* free memory. */
+ /* Don't free: comp[0] */
+ g_free(comp[1]);
+ /* Don't free: comp[2] */
+ g_free(comp[3]);
+ g_free(comp[4]);
+ g_free(comp[5]);
+
+ tvb_free_chain(tvb_parent); /* should free all tvb's and associated data */
}
+/* Note: valgrind can be used to check for tvbuff memory leaks */
int
main(void)
{
+ /* For valgrind: See GLib documentation: "Running GLib Applications" */
+ setenv("G_DEBUG", "gc-friendly", 1);
+ setenv("G_SLICE", "always-malloc", 1);
+
except_init();
run_tests();
except_deinit();