Change how dissectors do late-field-registration to avoid a double-registration

assertion.

If a dissector forces registration of fields during dissection it needs to do
so in a way that clears the prefix registration.  Otherwise epan will call the
registration routine a 2nd time (which will cause us to assert out) if a user
types a display filter (with the dissector's prefix) that doesn't exist.

Update the proto_register_prefix() comments to reflect this.

Change-Id: I3ce29243395fb55192bb5dfd950baa88410ac136
Reviewed-on: https://code.wireshark.org/review/15881
Petri-Dish: Jeff Morriss <jeff.morriss.ws@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Jaap Keuter <jaap.keuter@xs4all.nl>
This commit is contained in:
Jeff Morriss 2016-06-13 15:28:16 -04:00 committed by Jaap Keuter
parent 22fd85d178
commit 3a590217ac
4 changed files with 10 additions and 14 deletions

View File

@ -1194,8 +1194,6 @@ static const int *diameter_flags_fields[] = {
NULL
};
static void register_diameter_fields(const char *);
static int
dissect_diameter_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
{
@ -1221,7 +1219,7 @@ dissect_diameter_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi
/* Load header fields if not already done */
if (hf_diameter_code == -1)
register_diameter_fields("");
proto_registrar_get_byname("diameter.code");
diam_sub_dis_inf->application_id = tvb_get_ntohl(tvb,8);

View File

@ -1357,8 +1357,6 @@ vsa_buffer_table_destroy(void *table)
}
}
static void register_radius_fields(const char *);
void
dissect_attribute_value_pairs(proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb, int offset, guint length)
{
@ -1373,7 +1371,7 @@ dissect_attribute_value_pairs(proto_tree *tree, packet_info *pinfo, tvbuff_t *tv
GHashTable *vsa_buffer_table = NULL;
if (hf_radius_code == -1)
register_radius_fields("");
proto_registrar_get_byname("radius.code");
/*
* In case we throw an exception, clean up whatever stuff we've
@ -1847,7 +1845,7 @@ dissect_radius(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _
/* Load header fields if not already done */
if (hf_radius_code == -1)
register_radius_fields("");
proto_registrar_get_byname("radius.code");
ti = proto_tree_add_item(tree, proto_radius, tvb, 0, rh.rh_pktlength, ENC_NA);
radius_tree = proto_item_add_subtree(ti, ett_radius);
@ -2371,7 +2369,9 @@ radius_init_protocol(void)
radius_calls = wmem_map_new(wmem_file_scope(), radius_call_hash, radius_call_equal);
}
static void register_radius_fields(const char *unused _U_) {
static void
register_radius_fields(const char *unused _U_)
{
hf_register_info base_hf[] = {
{ &hf_radius_req,
{ "Request", "radius.req", FT_BOOLEAN, BASE_NONE, NULL, 0x0,

View File

@ -2097,7 +2097,8 @@ typedef void (*prefix_initializer_t)(const char* match);
/** Register a new prefix for delayed initialization of field arrays
Note that the initializer function MAY NOT be called before the dissector
is first called. That is, dissectors using this function must be prepared
to call the initializer before beginning dissection.
to call the initializer before beginning dissection; they should do this by
calling proto_registrar_get_byname() on one of the dissector's field names.
@param prefix the prefix for the new protocol
@param initializer function that will initialize the field array for the given prefix */
WS_DLL_PUBLIC void

View File

@ -2081,9 +2081,6 @@ match_ver_value_string(
return res? res->vs.strptr : NULL;
}
static void register_wimaxasncp_fields(const char*);
static int
dissect_wimaxasncp(
tvbuff_t *tvb,
@ -2158,9 +2155,9 @@ dissect_wimaxasncp(
offset = 0;
/* Register protocol fields, etc if haven't done yet. */
if (wimaxasncp_dict == NULL)
if (hf_wimaxasncp_version == -1)
{
register_wimaxasncp_fields(NULL);
proto_registrar_get_byname("wimaxasncp.version");
}
if (tree)