diff options
author | Bill Meier <wmeier@newsguy.com> | 2011-12-21 21:40:25 +0000 |
---|---|---|
committer | Bill Meier <wmeier@newsguy.com> | 2011-12-21 21:40:25 +0000 |
commit | 522950401f468bfb8a7b4079540c78d0f3c06452 (patch) | |
tree | d88d632ff9749b50ae26e6985faadff33dee8192 /epan/tvbtest.c | |
parent | 796847fdc7587615028d8f93c6e9590b9dd8642d (diff) | |
download | wireshark-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.c | 34 |
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(); |