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:
parent
22fd85d178
commit
3a590217ac
|
@ -1194,8 +1194,6 @@ static const int *diameter_flags_fields[] = {
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
static void register_diameter_fields(const char *);
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
dissect_diameter_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
|
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 */
|
/* Load header fields if not already done */
|
||||||
if (hf_diameter_code == -1)
|
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);
|
diam_sub_dis_inf->application_id = tvb_get_ntohl(tvb,8);
|
||||||
|
|
||||||
|
|
|
@ -1357,8 +1357,6 @@ vsa_buffer_table_destroy(void *table)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void register_radius_fields(const char *);
|
|
||||||
|
|
||||||
void
|
void
|
||||||
dissect_attribute_value_pairs(proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb, int offset, guint length)
|
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;
|
GHashTable *vsa_buffer_table = NULL;
|
||||||
|
|
||||||
if (hf_radius_code == -1)
|
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
|
* 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 */
|
/* Load header fields if not already done */
|
||||||
if (hf_radius_code == -1)
|
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);
|
ti = proto_tree_add_item(tree, proto_radius, tvb, 0, rh.rh_pktlength, ENC_NA);
|
||||||
radius_tree = proto_item_add_subtree(ti, ett_radius);
|
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);
|
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_register_info base_hf[] = {
|
||||||
{ &hf_radius_req,
|
{ &hf_radius_req,
|
||||||
{ "Request", "radius.req", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
|
{ "Request", "radius.req", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
|
||||||
|
|
|
@ -2097,7 +2097,8 @@ typedef void (*prefix_initializer_t)(const char* match);
|
||||||
/** Register a new prefix for delayed initialization of field arrays
|
/** Register a new prefix for delayed initialization of field arrays
|
||||||
Note that the initializer function MAY NOT be called before the dissector
|
Note that the initializer function MAY NOT be called before the dissector
|
||||||
is first called. That is, dissectors using this function must be prepared
|
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 prefix the prefix for the new protocol
|
||||||
@param initializer function that will initialize the field array for the given prefix */
|
@param initializer function that will initialize the field array for the given prefix */
|
||||||
WS_DLL_PUBLIC void
|
WS_DLL_PUBLIC void
|
||||||
|
|
|
@ -2081,9 +2081,6 @@ match_ver_value_string(
|
||||||
return res? res->vs.strptr : NULL;
|
return res? res->vs.strptr : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void register_wimaxasncp_fields(const char*);
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
dissect_wimaxasncp(
|
dissect_wimaxasncp(
|
||||||
tvbuff_t *tvb,
|
tvbuff_t *tvb,
|
||||||
|
@ -2158,9 +2155,9 @@ dissect_wimaxasncp(
|
||||||
offset = 0;
|
offset = 0;
|
||||||
|
|
||||||
/* Register protocol fields, etc if haven't done yet. */
|
/* 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)
|
if (tree)
|
||||||
|
|
Loading…
Reference in New Issue