aboutsummaryrefslogtreecommitdiffstats
path: root/epan/packet.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2016-08-30 15:51:54 -0700
committerGuy Harris <guy@alum.mit.edu>2016-08-31 00:08:01 +0000
commita4c8ebc18b71200d7a6245e386e97a9d14c5dbdb (patch)
tree4918b2d727a5d308dfbecfa41f9c559c73ca725b /epan/packet.c
parent1dbd2216edfe34e3dbb1f8967d325e7fa00ecb51 (diff)
Don't do any Decode As stuff for dissector tables not used with Decode As.
Have all dissector tables have a "supports Decode As" flag, which defaults to FALSE, and which is set to TRUE if a register_decode_as() refers to it. When adding a dissector to a dissector table with a given key, only add it for Decode As if the dissector table supports it. For non-FT_STRING dissector tables, always check for multiple entries for the same protocol with different dissectors, and report an error if we found them. This means there's no need for the creator of a dissector table to specify whether duplicates of that sort should be allowed - we always do the check when registering something for "Decode As" (in a non-FT_STRING dissector table), and just don't bother registering anything for "Decode As" if the dissector table doesn't support "Decode As", so there's no check done for those dissector tables. Change-Id: I4a1fdea3bddc2af27a65cfbca23edc99b26c0eed Reviewed-on: https://code.wireshark.org/review/17402 Petri-Dish: Guy Harris <guy@alum.mit.edu> Reviewed-by: Guy Harris <guy@alum.mit.edu>
Diffstat (limited to 'epan/packet.c')
-rw-r--r--epan/packet.c82
1 files changed, 53 insertions, 29 deletions
diff --git a/epan/packet.c b/epan/packet.c
index 018f15555e..ad3ef1d9c2 100644
--- a/epan/packet.c
+++ b/epan/packet.c
@@ -99,8 +99,8 @@ struct dissector_table {
ftenum_t type;
int param;
protocol_t *protocol;
- GHashFunc hash_func;
- dissector_table_allow_e allow_dup_proto; /* XXX - Could be converted to a flag-like field */
+ GHashFunc hash_func;
+ gboolean supports_decode_as;
};
static GHashTable *dissector_tables = NULL;
@@ -971,11 +971,12 @@ dissector_add_uint(const char *name, const guint32 pattern, dissector_handle_t h
GUINT_TO_POINTER( pattern), (gpointer)dtbl_entry);
/*
- * Now add it to the list of handles that could be used for
- * "Decode As" with this table, because it *is* being used
- * with this table.
+ * Now, if this table supports "Decode As", add this handle
+ * to the list of handles that could be used for "Decode As"
+ * with this table, because it *is* being used with this table.
*/
- dissector_add_for_decode_as(name, handle);
+ if (sub_dissectors->supports_decode_as)
+ dissector_add_for_decode_as(name, handle);
}
@@ -1344,11 +1345,12 @@ dissector_add_string(const char *name, const gchar *pattern,
(gpointer)dtbl_entry);
/*
- * Now add it to the list of handles that could be used for
- * "Decode As" with this table, because it *is* being used
- * with this table.
+ * Now, if this table supports "Decode As", add this handle
+ * to the list of handles that could be used for "Decode As"
+ * with this table, because it *is* being used with this table.
*/
- dissector_add_for_decode_as(name, handle);
+ if (sub_dissectors->supports_decode_as)
+ dissector_add_for_decode_as(name, handle);
}
/* Delete the entry for a dissector in a string dissector table
@@ -1569,11 +1571,12 @@ void dissector_add_custom_table_handle(const char *name, void *pattern, dissecto
(gpointer)dtbl_entry);
/*
- * Now add it to the list of handles that could be used for
- * "Decode As" with this table, because it *is* being used
- * with this table.
+ * Now, if this table supports "Decode As", add this handle
+ * to the list of handles that could be used for "Decode As"
+ * with this table, because it *is* being used with this table.
*/
- dissector_add_for_decode_as(name, handle);
+ if (sub_dissectors->supports_decode_as)
+ dissector_add_for_decode_as(name, handle);
}
dissector_handle_t dissector_get_custom_table_handle(dissector_table_t sub_dissectors, void *key)
@@ -1626,11 +1629,12 @@ void dissector_add_guid(const char *name, guid_key* guid_val, dissector_handle_t
guid_val, (gpointer)dtbl_entry);
/*
- * Now add it to the list of handles that could be used with this
- * table, because it *is* being used with this table.
+ * Now, if this table supports "Decode As", add this handle
+ * to the list of handles that could be used for "Decode As"
+ * with this table, because it *is* being used with this table.
*/
- dissector_add_for_decode_as(name, handle);
-
+ if (sub_dissectors->supports_decode_as)
+ dissector_add_for_decode_as(name, handle);
}
/* Look for a given value in a given guid dissector table and, if found,
@@ -1759,6 +1763,24 @@ dissector_add_for_decode_as(const char *name, dissector_handle_t handle)
return;
}
+ /*
+ * Make sure it supports Decode As.
+ */
+ if (!sub_dissectors->supports_decode_as) {
+ const char *dissector_name;
+
+ dissector_name = dissector_handle_get_dissector_name(handle);
+ if (dissector_name == NULL)
+ dissector_name = "(anonymous)";
+ fprintf(stderr, "Registering dissector %s for protocol %s in dissector table %s, which doesn't support Decode As\n",
+ dissector_name,
+ proto_get_protocol_short_name(handle->protocol),
+ name);
+ if (getenv("WIRESHARK_ABORT_ON_DISSECTOR_BUG") != NULL)
+ abort();
+ return;
+ }
+
/* Add the dissector as a dependency
(some dissector tables don't have protocol association, so there is
the need for the NULL check */
@@ -1774,9 +1796,12 @@ dissector_add_for_decode_as(const char *name, dissector_handle_t handle)
return;
}
- /* Ensure the protocol is unique. This prevents confusion when using Decode As
- with duplicative entries */
- if (sub_dissectors->allow_dup_proto == DISSECTOR_TABLE_NOT_ALLOW_DUPLICATE)
+ /* Ensure the protocol is unique. This prevents confusion when
+ using Decode As with duplicative entries.
+
+ FT_STRING can at least show the string value in the dialog,
+ so we don't do the check for them. */
+ if (sub_dissectors->type != FT_STRING)
{
for (entry = sub_dissectors->dissector_handles; entry != NULL; entry = g_slist_next(entry))
{
@@ -1824,11 +1849,10 @@ dissector_table_get_type(dissector_table_t dissector_table) {
return dissector_table->type;
}
-dissector_table_allow_e
-dissector_table_get_proto_allowed(dissector_table_t dissector_table)
+void
+dissector_table_allow_decode_as(dissector_table_t dissector_table)
{
- if (!dissector_table) return DISSECTOR_TABLE_NOT_ALLOW_DUPLICATE;
- return dissector_table->allow_dup_proto;
+ dissector_table->supports_decode_as = TRUE;
}
static gint
@@ -2089,7 +2113,7 @@ dissector_all_tables_foreach_table (DATFunc_table func,
dissector_table_t
register_dissector_table(const char *name, const char *ui_name, const int proto, const ftenum_t type,
- const int param, dissector_table_allow_e allow_dup)
+ const int param)
{
dissector_table_t sub_dissectors;
@@ -2142,13 +2166,13 @@ register_dissector_table(const char *name, const char *ui_name, const int proto,
sub_dissectors->type = type;
sub_dissectors->param = param;
sub_dissectors->protocol = find_protocol_by_id(proto);
- sub_dissectors->allow_dup_proto = allow_dup;
+ sub_dissectors->supports_decode_as = FALSE;
g_hash_table_insert( dissector_tables, (gpointer)name, (gpointer) sub_dissectors );
return sub_dissectors;
}
dissector_table_t register_custom_dissector_table(const char *name,
- const char *ui_name, const int proto, GHashFunc hash_func, GEqualFunc key_equal_func, dissector_table_allow_e allow_dup)
+ const char *ui_name, const int proto, GHashFunc hash_func, GEqualFunc key_equal_func)
{
dissector_table_t sub_dissectors;
@@ -2171,7 +2195,7 @@ dissector_table_t register_custom_dissector_table(const char *name,
sub_dissectors->type = FT_BYTES; /* Consider key a "blob" of data, no need to really create new type */
sub_dissectors->param = BASE_NONE;
sub_dissectors->protocol = find_protocol_by_id(proto);
- sub_dissectors->allow_dup_proto = allow_dup;
+ sub_dissectors->supports_decode_as = FALSE;
g_hash_table_insert( dissector_tables, (gpointer)name, (gpointer) sub_dissectors );
return sub_dissectors;
}