aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors
diff options
context:
space:
mode:
authorDario Lombardo <lomato@gmail.com>2016-02-18 11:30:41 +0100
committerAnders Broman <a.broman58@gmail.com>2016-02-25 04:31:44 +0000
commitb64d19bba2b7b358cea497501f25afe9d97a801d (patch)
tree810841440ba63e4a9c8b1ff9f22cfb89c75bb489 /epan/dissectors
parent4fec250ed953192b3de697f6fb6b773d03e1a0c5 (diff)
diameter: change GArray into wmem_array.
This change fixes a leak in packet-diameter that loads a dictionary but doesn't free all the data. Found by valgrind. ==30481== 36,656 (960 direct, 35,696 indirect) bytes in 24 blocks are definitely lost in loss record 3,417 of 3,421 ==30481== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==30481== by 0xA7FE610: g_malloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4002.0) ==30481== by 0xA81422D: g_slice_alloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4002.0) ==30481== by 0xA7CDC44: g_array_sized_new (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4002.0) ==30481== by 0x6863743: dictionary_load (packet-diameter.c:1980) ==30481== by 0x6863743: proto_register_diameter (packet-diameter.c:2344) ==30481== by 0x71C4BA4: register_all_protocols (register.c:323) ==30481== by 0x65EEFA7: proto_init (proto.c:521) ==30481== by 0x65CD621: epan_init (epan.c:126) ==30481== by 0x115330: main (tshark.c:1220) Change-Id: I3c0d19e1accab415355aa0f50c598f0c83356985 Reviewed-on: https://code.wireshark.org/review/13821 Petri-Dish: Dario Lombardo <lomato@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Evan Huus <eapache@gmail.com> Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/dissectors')
-rw-r--r--epan/dissectors/packet-diameter.c40
1 files changed, 26 insertions, 14 deletions
diff --git a/epan/dissectors/packet-diameter.c b/epan/dissectors/packet-diameter.c
index 721a5b8695..06f20b8111 100644
--- a/epan/dissectors/packet-diameter.c
+++ b/epan/dissectors/packet-diameter.c
@@ -121,9 +121,9 @@ typedef const char *(*diam_avp_dissector_t)(diam_ctx_t *, diam_avp_t *, tvbuff_t
typedef struct _diam_vnd_t {
guint32 code;
- GArray *vs_avps;
+ wmem_array_t *vs_avps;
value_string_ext *vs_avps_ext;
- GArray *vs_cmds;
+ wmem_array_t *vs_cmds;
} diam_vnd_t;
struct _diam_avp_t {
@@ -137,9 +137,9 @@ struct _diam_avp_t {
void *type_data;
};
-#define VND_AVP_VS(v) ((value_string *)(void *)((v)->vs_avps->data))
-#define VND_AVP_VS_LEN(v) ((v)->vs_avps->len)
-#define VND_CMD_VS(v) ((value_string *)(void *)((v)->vs_cmds->data))
+#define VND_AVP_VS(v) ((value_string *)(void *)(wmem_array_get_raw((v)->vs_avps)))
+#define VND_AVP_VS_LEN(v) (wmem_array_get_count((v)->vs_avps))
+#define VND_CMD_VS(v) ((value_string *)(void *)(wmem_array_get_raw((v)->vs_cmds)))
typedef struct _diam_dictionary_t {
wmem_tree_t *avps;
@@ -684,7 +684,7 @@ dissect_diameter_avp(diam_ctx_t *c, tvbuff_t *tvb, int offset, diam_sub_dis_t *d
}
if (vendor->vs_avps_ext == NULL) {
- g_array_sort(vendor->vs_avps, compare_avps);
+ wmem_array_sort(vendor->vs_avps, compare_avps);
vendor->vs_avps_ext = value_string_ext_new(VND_AVP_VS(vendor),
VND_AVP_VS_LEN(vendor)+1,
g_strdup_printf("diameter_vendor_%s",
@@ -1874,10 +1874,18 @@ dictionary_load(void)
dictionary.vnds = wmem_tree_new(wmem_epan_scope());
dictionary.avps = wmem_tree_new(wmem_epan_scope());
- unknown_vendor.vs_cmds = g_array_new(TRUE,TRUE,sizeof(value_string));
- unknown_vendor.vs_avps = g_array_new(TRUE,TRUE,sizeof(value_string));
- no_vnd.vs_cmds = g_array_new(TRUE,TRUE,sizeof(value_string));
- no_vnd.vs_avps = g_array_new(TRUE,TRUE,sizeof(value_string));
+ unknown_vendor.vs_cmds = wmem_array_new(wmem_epan_scope(), sizeof(value_string));
+ wmem_array_set_null_terminator(unknown_vendor.vs_cmds);
+ wmem_array_bzero(unknown_vendor.vs_cmds);
+ unknown_vendor.vs_avps = wmem_array_new(wmem_epan_scope(), sizeof(value_string));
+ wmem_array_set_null_terminator(unknown_vendor.vs_avps);
+ wmem_array_bzero(unknown_vendor.vs_avps);
+ no_vnd.vs_cmds = wmem_array_new(wmem_epan_scope(), sizeof(value_string));
+ wmem_array_set_null_terminator(no_vnd.vs_cmds);
+ wmem_array_bzero(no_vnd.vs_cmds);
+ no_vnd.vs_avps = wmem_array_new(wmem_epan_scope(), sizeof(value_string));
+ wmem_array_set_null_terminator(no_vnd.vs_avps);
+ wmem_array_bzero(no_vnd.vs_avps);
all_cmds = g_array_new(TRUE,TRUE,sizeof(value_string));
@@ -1976,8 +1984,12 @@ dictionary_load(void)
vnd = wmem_new(wmem_epan_scope(), diam_vnd_t);
vnd->code = v->code;
- vnd->vs_cmds = g_array_new(TRUE,TRUE,sizeof(value_string));
- vnd->vs_avps = g_array_new(TRUE,TRUE,sizeof(value_string));
+ vnd->vs_cmds = wmem_array_new(wmem_epan_scope(), sizeof(value_string));
+ wmem_array_set_null_terminator(vnd->vs_cmds);
+ wmem_array_bzero(vnd->vs_cmds);
+ vnd->vs_avps = wmem_array_new(wmem_epan_scope(), sizeof(value_string));
+ wmem_array_set_null_terminator(vnd->vs_avps);
+ wmem_array_bzero(vnd->vs_avps);
vnd->vs_avps_ext = NULL;
wmem_tree_insert32(dictionary.vnds,vnd->code,vnd);
g_hash_table_insert(vendors,v->name,vnd);
@@ -2001,7 +2013,7 @@ dictionary_load(void)
item[0].value = c->code;
item[0].strptr = c->name;
- g_array_append_val(vnd->vs_cmds,item);
+ wmem_array_append_one(vnd->vs_cmds,item);
/* Also add to all_cmds as used by RFC version */
g_array_append_val(all_cmds,item);
} else {
@@ -2030,7 +2042,7 @@ dictionary_load(void)
vndvs[0].strptr = a->name;
- g_array_append_val(vnd->vs_avps,vndvs);
+ wmem_array_append_one(vnd->vs_avps,vndvs);
} else {
report_failure("Diameter Dictionary: No Vendor: %s\n",vend);
vnd = &unknown_vendor;