diff options
Diffstat (limited to 'epan/dissectors')
-rw-r--r-- | epan/dissectors/packet-mswsp.c | 31 | ||||
-rw-r--r-- | epan/dissectors/packet-multipart.c | 32 | ||||
-rw-r--r-- | epan/dissectors/packet-pcp.c | 60 |
3 files changed, 22 insertions, 101 deletions
diff --git a/epan/dissectors/packet-mswsp.c b/epan/dissectors/packet-mswsp.c index 3e5b7ca969..de3d0826d2 100644 --- a/epan/dissectors/packet-mswsp.c +++ b/epan/dissectors/packet-mswsp.c @@ -717,25 +717,6 @@ static gboolean get_fid_and_frame(packet_info *pinfo, guint32 *fid, guint *frame return result; } -static GSList *conv_tables = NULL; - -static void -mswsp_init_protocol(void) -{ - GSList *table_iter; - if (conv_tables) { - for(table_iter = conv_tables; table_iter; - table_iter = table_iter->next) { - struct mswsp_ct *ct = (struct mswsp_ct *)table_iter->data; - /* should we free the elements the GSL_message_data */ - g_slist_free(ct->GSL_message_data); - g_free(ct); - } - g_slist_free(conv_tables); - conv_tables = NULL; - } -} - static struct message_data *find_or_create_message_data(struct mswsp_ct *conv_data, packet_info *pinfo, guint16 msg_id, gboolean is_request, void *data) { struct message_data to_find; @@ -765,20 +746,17 @@ static struct mswsp_ct *get_create_converstation_data(packet_info *pinfo) struct mswsp_ct *ct = NULL; conversation_t *conversation; - conversation = find_or_create_conversation(pinfo); if (!conversation) { - goto out; + return NULL; } ct = (struct mswsp_ct*)conversation_get_proto_data(conversation, proto_mswsp); if (!ct) { - ct = (struct mswsp_ct *)g_malloc(sizeof(struct mswsp_ct)); + ct = wmem_new(wmem_file_scope(), struct mswsp_ct); ct->GSL_message_data = NULL; - /* store ct so it can be deallocated later */ - conv_tables = g_slist_prepend(conv_tables, ct); conversation_add_proto_data(conversation, proto_mswsp, ct); } -out: + return ct; } @@ -8065,9 +8043,6 @@ proto_register_mswsp(void) for (i=0; i<(int)array_length(GuidPropertySet); i++) { guids_add_guid(&GuidPropertySet[i].guid, GuidPropertySet[i].def); } - - register_init_routine(&mswsp_init_protocol); - } static int dissect_mswsp_smb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) diff --git a/epan/dissectors/packet-multipart.c b/epan/dissectors/packet-multipart.c index ff09f4515f..760e76b56f 100644 --- a/epan/dissectors/packet-multipart.c +++ b/epan/dissectors/packet-multipart.c @@ -444,12 +444,12 @@ get_multipart_info(packet_info *pinfo, const char *str) /* * There is a value for the boundary string */ - m_info = (multipart_info_t *)g_malloc(sizeof(multipart_info_t)); + m_info = wmem_new(wmem_packet_scope(), multipart_info_t); m_info->type = type; - m_info->boundary = g_strndup(start_boundary, len_boundary); + m_info->boundary = wmem_strndup(wmem_packet_scope(), start_boundary, len_boundary); m_info->boundary_length = len_boundary; if(start_protocol) { - m_info->protocol = g_strndup(start_protocol, len_protocol); + m_info->protocol = wmem_strndup(wmem_packet_scope(), start_protocol, len_protocol); m_info->protocol_length = len_protocol; } else { m_info->protocol = NULL; @@ -461,19 +461,6 @@ get_multipart_info(packet_info *pinfo, const char *str) return m_info; } -static void -cleanup_multipart_info(void *data) -{ - multipart_info_t *m_info = (multipart_info_t *)data; - if (m_info) { - if (m_info->protocol) { - g_free(m_info->protocol); - } - g_free(m_info->boundary); - g_free(m_info); - } -} - /* * The first boundary does not implicitly contain the leading * line-end sequence. @@ -622,10 +609,8 @@ dissect_kerberos_encrypted_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree DISSECTOR_ASSERT(tvb_bytes_exist(tvb, offset, len)); - data = (guint8 *) g_malloc(len); - tvb_memcpy(tvb, data, offset, len); + data = (guint8 *)tvb_memdup(pinfo->pool, tvb, offset, len); kerberos_tvb = tvb_new_child_real_data(tvb, data, len, len); - tvb_set_free_cb(kerberos_tvb, g_free); add_new_data_source(pinfo, kerberos_tvb, "Kerberos Data"); call_dissector_with_data(gssapi_handle, kerberos_tvb, pinfo, tree, encrypt); @@ -936,8 +921,6 @@ static int dissect_multipart(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree call_data_dissector(tvb, pinfo, tree); return tvb_reported_length(tvb); } - /* Clean up the memory if an exception is thrown */ - /* CLEANUP_PUSH(cleanup_multipart_info, m_info); */ /* Add stuff to the protocol tree */ ti = proto_tree_add_item(tree, proto_multipart, @@ -963,8 +946,6 @@ static int dissect_multipart(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree header_start = process_preamble(subtree, tvb, m_info, &last_boundary); if (header_start == -1) { call_data_dissector(tvb, pinfo, subtree); - /* Clean up the dynamically allocated memory */ - cleanup_multipart_info(m_info); return tvb_reported_length(tvb); } /* @@ -974,8 +955,6 @@ static int dissect_multipart(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree header_start = process_body_part(subtree, tvb, m_info, pinfo, header_start, body_index++, &last_boundary); if (header_start == -1) { - /* Clean up the dynamically allocated memory */ - cleanup_multipart_info(m_info); return tvb_reported_length(tvb); } } @@ -985,8 +964,7 @@ static int dissect_multipart(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree if (tvb_reported_length_remaining(tvb, header_start) > 0) { proto_tree_add_item(subtree, hf_multipart_trailer, tvb, header_start, -1, ENC_NA); } - /* Clean up the dynamically allocated memory */ - cleanup_multipart_info(m_info); + return tvb_reported_length(tvb); } diff --git a/epan/dissectors/packet-pcp.c b/epan/dissectors/packet-pcp.c index 340ff952a0..fcd3b5cb40 100644 --- a/epan/dissectors/packet-pcp.c +++ b/epan/dissectors/packet-pcp.c @@ -450,23 +450,18 @@ static const value_string packettypenames_creds[]= { }; typedef struct pcp_conv_info_t { - struct pcp_conv_info_t *next; - GArray *pmid_name_candidates; - GHashTable *pmid_to_name; + wmem_array_t *pmid_name_candidates; + wmem_map_t *pmid_to_name; guint32 last_pmns_names_frame; guint32 last_processed_pmns_names_frame; } pcp_conv_info_t; -static pcp_conv_info_t *pcp_conv_info_items = NULL; - /* function prototypes */ -static void pcp_cleanup(void); static pcp_conv_info_t* get_pcp_conversation_info(packet_info *pinfo); static int is_unvisited_pmns_names_frame(packet_info *pinfo); static void add_candidate_name_for_pmid_resolution(packet_info *pinfo, tvbuff_t *tvb, int offset, int name_len); static void mark_this_frame_as_last_pmns_names_frame(packet_info *pinfo); static inline int has_unprocessed_pmns_names_frame(pcp_conv_info_t *pcp_conv_info); -static void clear_name_candidates(GArray *pmid_name_candidates); static void create_pmid_to_name_map_from_candidates(pcp_conv_info_t *pcp_conv_info, tvbuff_t *tvb, int offset, guint32 num_ids); static void populate_pmids_to_names(packet_info *pinfo, tvbuff_t *tvb, int offset, guint32 num_ids); static inline int client_to_server(packet_info *pinfo); @@ -519,19 +514,13 @@ static inline int client_to_server(packet_info *pinfo) { return pinfo->destport == PCP_PORT || pinfo->destport == PMPROXY_PORT; } -static void clear_name_candidates(GArray *pmid_name_candidates) { - if(pmid_name_candidates->len > 0) { - g_array_remove_range(pmid_name_candidates, 0, pmid_name_candidates->len); - } -} - static guint8* get_name_from_pmid(guint32 pmid, packet_info *pinfo) { guint8 *name; - GHashTable *pmid_to_name; + wmem_map_t *pmid_to_name; pmid_to_name = get_pcp_conversation_info(pinfo)->pmid_to_name; - name = (guint8*)g_hash_table_lookup(pmid_to_name, GINT_TO_POINTER(pmid)); + name = (guint8*)wmem_map_lookup(pmid_to_name, GINT_TO_POINTER(pmid)); if(!name) { name = (guint8*)wmem_strdup(wmem_packet_scope(), "Metric name unknown"); } @@ -592,7 +581,7 @@ static void add_candidate_name_for_pmid_resolution(packet_info *pinfo, tvbuff_t if(is_unvisited_pmns_names_frame(pinfo)) { name = tvb_get_string_enc(wmem_file_scope(), tvb, offset, name_len, ENC_ASCII); - g_array_append_val(pcp_conv_info->pmid_name_candidates, name); + wmem_array_append_one(pcp_conv_info->pmid_name_candidates, name); } } @@ -609,14 +598,15 @@ static void populate_pmids_to_names(packet_info *pinfo, tvbuff_t *tvb, int offse guint number_of_name_candidates; pcp_conv_info = get_pcp_conversation_info(pinfo); - number_of_name_candidates = pcp_conv_info->pmid_name_candidates->len; + number_of_name_candidates = wmem_array_get_count(pcp_conv_info->pmid_name_candidates); if(number_of_name_candidates == num_ids && has_unprocessed_pmns_names_frame(pcp_conv_info)) { create_pmid_to_name_map_from_candidates(pcp_conv_info, tvb, offset, num_ids); /* Set this frame to the one that we processed */ pcp_conv_info->last_processed_pmns_names_frame = pcp_conv_info->last_pmns_names_frame; } - clear_name_candidates(pcp_conv_info->pmid_name_candidates); + + pcp_conv_info->pmid_name_candidates = wmem_array_new(wmem_file_scope(), sizeof(guint8 *)); } static void create_pmid_to_name_map_from_candidates(pcp_conv_info_t *pcp_conv_info, tvbuff_t *tvb, int offset, guint32 num_ids) { @@ -627,10 +617,10 @@ static void create_pmid_to_name_map_from_candidates(pcp_conv_info_t *pcp_conv_in guint8 *pmid_name; pmid = tvb_get_ntohl(tvb, offset); - pmid_name = g_array_index(pcp_conv_info->pmid_name_candidates, guint8*, i); + pmid_name = wmem_array_index(pcp_conv_info->pmid_name_candidates, i); - if(g_hash_table_lookup(pcp_conv_info->pmid_to_name, GINT_TO_POINTER(pmid)) == NULL) { - g_hash_table_insert(pcp_conv_info->pmid_to_name, GINT_TO_POINTER(pmid), pmid_name); + if(wmem_map_lookup(pcp_conv_info->pmid_to_name, GINT_TO_POINTER(pmid)) == NULL) { + wmem_map_insert(pcp_conv_info->pmid_to_name, GINT_TO_POINTER(pmid), pmid_name); } offset += 4; } @@ -687,7 +677,7 @@ static int dissect_pcp_message_error(tvbuff_t *tvb, packet_info *pinfo, proto_tr */ if(error_num == PM_ERR_NAME) { pcp_conv_info = get_pcp_conversation_info(pinfo); - clear_name_candidates(pcp_conv_info->pmid_name_candidates); + pcp_conv_info->pmid_name_candidates = wmem_array_new(wmem_file_scope(), sizeof(guint8 *)); } return offset; @@ -1641,13 +1631,10 @@ static int dissect_pcp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr pcp_conv_info = (pcp_conv_info_t*)g_malloc(sizeof(pcp_conv_info_t)); conversation_add_proto_data(conversation, proto_pcp, pcp_conv_info); - pcp_conv_info->pmid_name_candidates = g_array_new(TRUE, TRUE, sizeof(guint8 *)); - pcp_conv_info->pmid_to_name = g_hash_table_new(g_direct_hash, g_direct_equal); + pcp_conv_info->pmid_name_candidates = wmem_array_new(wmem_file_scope(), sizeof(guint8 *)); + pcp_conv_info->pmid_to_name = wmem_map_new(wmem_file_scope(), g_direct_hash, g_direct_equal); pcp_conv_info->last_pmns_names_frame = 0; pcp_conv_info->last_processed_pmns_names_frame = 0; - - pcp_conv_info->next = pcp_conv_info_items; - pcp_conv_info_items = pcp_conv_info; } root_pcp_item = proto_tree_add_item(tree, proto_pcp, tvb, 0, -1, ENC_NA); @@ -1762,23 +1749,6 @@ static int dissect_pcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void return tvb_captured_length(tvb); } -static void pcp_cleanup(void) { - pcp_conv_info_t *pcp_conv_info; - - for(pcp_conv_info = pcp_conv_info_items; pcp_conv_info != NULL; ) { - pcp_conv_info_t *last; - - g_hash_table_destroy(pcp_conv_info->pmid_to_name); - /* Don't free array elements (FALSE arg) as their memory is controlled via wmem */ - g_array_free(pcp_conv_info->pmid_name_candidates, FALSE); - - last = pcp_conv_info; - pcp_conv_info = pcp_conv_info->next; - - g_free(last); - } -} - /* setup the dissecting */ void proto_register_pcp(void) { @@ -2587,8 +2557,6 @@ void proto_register_pcp(void) proto_register_subtree_array(ett, array_length(ett)); pcp_handle = register_dissector("pcp", dissect_pcp, proto_pcp); - - register_cleanup_routine(pcp_cleanup); } void proto_reg_handoff_pcp(void) |