GSM over IP: Require a valid message type for dissection.
Protects against some false positives because by default GSM over IP claims some "frequently used" ports. Change-Id: I94736ecef8ac1422bb330a364a3f77edd9a52a2b Reviewed-on: https://code.wireshark.org/review/31265 Petri-Dish: Michael Mann <mmann78@netscape.net> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
This commit is contained in:
parent
a88d60509d
commit
080ff63a00
|
@ -112,12 +112,12 @@ static dissector_table_t osmo_dissector_table;
|
||||||
|
|
||||||
static const value_string ipa_protocol_vals[] = {
|
static const value_string ipa_protocol_vals[] = {
|
||||||
{ 0x00, "RSL" },
|
{ 0x00, "RSL" },
|
||||||
{ 0xdd, "HSL Debug" },
|
{ HSL_DEBUG, "HSL Debug" },
|
||||||
{ 0xee, "OSMO EXT" },
|
{ OSMO_EXT, "OSMO EXT" },
|
||||||
{ 0xfc, "MGCP (old)" },
|
{ IPA_MGCP, "MGCP (old)" },
|
||||||
{ 0xfd, "SCCP" },
|
{ AIP_SCCP, "SCCP" },
|
||||||
{ 0xfe, "IPA" },
|
{ ABISIP_IPACCESS, "IPA" },
|
||||||
{ 0xff, "OML" },
|
{ ABISIP_OML, "OML" },
|
||||||
{ 0, NULL }
|
{ 0, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -259,12 +259,22 @@ dissect_osmo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ipatree, proto_tree
|
||||||
|
|
||||||
|
|
||||||
/* Code to actually dissect the packets */
|
/* Code to actually dissect the packets */
|
||||||
static void
|
static gboolean
|
||||||
dissect_ipa(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboolean is_udp)
|
dissect_ipa(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboolean is_udp)
|
||||||
{
|
{
|
||||||
gint remaining;
|
gint remaining;
|
||||||
gint header_length = 3;
|
gint header_length = 3;
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
|
guint16 len, msg_type;
|
||||||
|
|
||||||
|
if (tvb_reported_length(tvb) < 4)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
//sanity check the message type
|
||||||
|
msg_type = tvb_get_guint8(tvb, 2);
|
||||||
|
if ((try_val_to_str(msg_type, ipa_protocol_vals) == NULL) &&
|
||||||
|
(msg_type >= ABISIP_RSL_MAX))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
col_set_str(pinfo->cinfo, COL_PROTOCOL, "IPA");
|
col_set_str(pinfo->cinfo, COL_PROTOCOL, "IPA");
|
||||||
col_clear(pinfo->cinfo, COL_INFO);
|
col_clear(pinfo->cinfo, COL_INFO);
|
||||||
|
@ -272,7 +282,6 @@ dissect_ipa(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboolean is_udp
|
||||||
while ((remaining = tvb_reported_length_remaining(tvb, offset)) > 0) {
|
while ((remaining = tvb_reported_length_remaining(tvb, offset)) > 0) {
|
||||||
proto_item *ti;
|
proto_item *ti;
|
||||||
proto_tree *ipa_tree = NULL;
|
proto_tree *ipa_tree = NULL;
|
||||||
guint16 len, msg_type;
|
|
||||||
tvbuff_t *next_tvb;
|
tvbuff_t *next_tvb;
|
||||||
|
|
||||||
len = tvb_get_ntohs(tvb, offset);
|
len = tvb_get_ntohs(tvb, offset);
|
||||||
|
@ -345,19 +354,24 @@ dissect_ipa(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboolean is_udp
|
||||||
}
|
}
|
||||||
offset += len + header_length;
|
offset += len + header_length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
dissect_ipa_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
|
dissect_ipa_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
|
||||||
{
|
{
|
||||||
dissect_ipa(tvb, pinfo, tree, FALSE);
|
if (!dissect_ipa(tvb, pinfo, tree, FALSE))
|
||||||
|
return 0;
|
||||||
return tvb_captured_length(tvb);
|
return tvb_captured_length(tvb);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
dissect_ipa_udp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
|
dissect_ipa_udp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
|
||||||
{
|
{
|
||||||
dissect_ipa(tvb, pinfo, tree, TRUE);
|
if (!dissect_ipa(tvb, pinfo, tree, TRUE))
|
||||||
|
return 0;
|
||||||
|
|
||||||
return tvb_captured_length(tvb);
|
return tvb_captured_length(tvb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue