diff options
Diffstat (limited to 'epan/packet.c')
-rw-r--r-- | epan/packet.c | 39 |
1 files changed, 24 insertions, 15 deletions
diff --git a/epan/packet.c b/epan/packet.c index 8ffdfd8dd9..6a4664eb92 100644 --- a/epan/packet.c +++ b/epan/packet.c @@ -106,6 +106,10 @@ static GHashTable *dissector_tables = NULL; */ static GHashTable *registered_dissectors = NULL; +struct heur_dissector_list { + GSList *list; +}; + static GHashTable *heur_dissector_lists = NULL; static void @@ -1878,10 +1882,10 @@ get_dissector_table_param(const char *name) } /* Finds a heuristic dissector table by table name. */ -heur_dissector_list_t * +heur_dissector_list_t find_heur_dissector_list(const char *name) { - return (heur_dissector_list_t *)g_hash_table_lookup(heur_dissector_lists, name); + return (heur_dissector_list_t)g_hash_table_lookup(heur_dissector_lists, name); } gboolean @@ -1892,7 +1896,7 @@ has_heur_dissector_list(const gchar *name) { void heur_dissector_add(const char *name, heur_dissector_t dissector, const int proto) { - heur_dissector_list_t *sub_dissectors = find_heur_dissector_list(name); + heur_dissector_list_t sub_dissectors = find_heur_dissector_list(name); const char *proto_name; heur_dtbl_entry_t *hdtbl_entry; @@ -1921,7 +1925,7 @@ heur_dissector_add(const char *name, heur_dissector_t dissector, const int proto hdtbl_entry->enabled = TRUE; /* do the table insertion */ - *sub_dissectors = g_slist_prepend(*sub_dissectors, (gpointer)hdtbl_entry); + sub_dissectors->list = g_slist_prepend(sub_dissectors->list, (gpointer)hdtbl_entry); } @@ -1937,7 +1941,7 @@ find_matching_heur_dissector( gconstpointer a, gconstpointer b) { void heur_dissector_delete(const char *name, heur_dissector_t dissector, const int proto) { - heur_dissector_list_t *sub_dissectors = find_heur_dissector_list(name); + heur_dissector_list_t sub_dissectors = find_heur_dissector_list(name); heur_dtbl_entry_t hdtbl_entry; GSList *found_entry; @@ -1948,18 +1952,18 @@ heur_dissector_delete(const char *name, heur_dissector_t dissector, const int pr hdtbl_entry.protocol = find_protocol_by_id(proto); - found_entry = g_slist_find_custom(*sub_dissectors, (gpointer) &hdtbl_entry, find_matching_heur_dissector); + found_entry = g_slist_find_custom(sub_dissectors->list, (gpointer) &hdtbl_entry, find_matching_heur_dissector); if (found_entry) { g_free(((heur_dtbl_entry_t *)(found_entry->data))->list_name); g_slice_free(heur_dtbl_entry_t, found_entry->data); - *sub_dissectors = g_slist_delete_link(*sub_dissectors, found_entry); + sub_dissectors->list = g_slist_delete_link(sub_dissectors->list, found_entry); } } void heur_dissector_set_enabled(const char *name, heur_dissector_t dissector, const int proto, const gboolean enabled) { - heur_dissector_list_t *sub_dissectors = find_heur_dissector_list(name); + heur_dissector_list_t sub_dissectors = find_heur_dissector_list(name); GSList *found_entry; heur_dtbl_entry_t hdtbl_entry; @@ -1970,7 +1974,7 @@ heur_dissector_set_enabled(const char *name, heur_dissector_t dissector, const i hdtbl_entry.protocol = find_protocol_by_id(proto); - found_entry = g_slist_find_custom(*sub_dissectors, (gpointer) &hdtbl_entry, find_matching_heur_dissector); + found_entry = g_slist_find_custom(sub_dissectors->list, (gpointer) &hdtbl_entry, find_matching_heur_dissector); if (found_entry) { heur_dtbl_entry_t *hdtbl_entry_p; @@ -2012,7 +2016,8 @@ dissector_try_heuristic(heur_dissector_list_t sub_dissectors, tvbuff_t *tvb, saved_layers_len = wmem_list_count(pinfo->layers); *heur_dtbl_entry = NULL; - for (entry = sub_dissectors; entry != NULL; entry = g_slist_next(entry)) { + for (entry = sub_dissectors->list; entry != NULL; + entry = g_slist_next(entry)) { /* XXX - why set this now and above? */ pinfo->can_desegment = saved_can_desegment-(saved_can_desegment>0); hdtbl_entry = (heur_dtbl_entry_t *)entry->data; @@ -2100,12 +2105,12 @@ heur_dissector_table_foreach (const char *table_name, gpointer user_data) { heur_dissector_foreach_info_t info; - heur_dissector_list_t *list = find_heur_dissector_list(table_name); + heur_dissector_list_t sub_dissectors = find_heur_dissector_list(table_name); info.table_name = table_name; info.caller_func = func; info.caller_data = user_data; - g_slist_foreach (*list, heur_dissector_table_foreach_func, &info); + g_slist_foreach (sub_dissectors->list, heur_dissector_table_foreach_func, &info); } /* @@ -2199,15 +2204,19 @@ dissector_dump_heur_decodes(void) } -void -register_heur_dissector_list(const char *name, heur_dissector_list_t *sub_dissectors) +heur_dissector_list_t +register_heur_dissector_list(const char *name) { + heur_dissector_list_t sub_dissectors; + /* Make sure the registration is unique */ g_assert(g_hash_table_lookup(heur_dissector_lists, name) == NULL); - *sub_dissectors = NULL; /* initially empty */ + sub_dissectors = g_slice_new(struct heur_dissector_list); + sub_dissectors->list = NULL; /* initially empty */ g_hash_table_insert(heur_dissector_lists, (gpointer)name, (gpointer) sub_dissectors); + return sub_dissectors; } /* |