diff options
Diffstat (limited to 'epan/dissectors/packet-xmcp.c')
-rw-r--r-- | epan/dissectors/packet-xmcp.c | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/epan/dissectors/packet-xmcp.c b/epan/dissectors/packet-xmcp.c index 06b518eeb5..42af4c73a3 100644 --- a/epan/dissectors/packet-xmcp.c +++ b/epan/dissectors/packet-xmcp.c @@ -826,8 +826,8 @@ decode_xmcp_attr_value (proto_tree *attr_tree, guint16 attr_type, } } -static void -dissect_xmcp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) +static int +dissect_xmcp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) { guint16 msg_type, msg_length; proto_item *ti = NULL; @@ -842,16 +842,16 @@ dissect_xmcp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) xmcp_transaction_t *xmcp_trans; if (tvb_reported_length(tvb) < XMCP_HDR_LEN) { - return; + return 0; } /* Check for valid message type field */ msg_type = tvb_get_ntohs(tvb, 0); if (msg_type & XMCP_TYPE_RESERVED) { /* First 2 bits must be 0 */ - return; + return 0; } /* Check for valid "magic cookie" field */ if (tvb_get_ntohl(tvb, 4) != XMCP_MAGIC_COOKIE) { - return; + return 0; } col_set_str(pinfo->cinfo, COL_PROTOCOL, "XMCP"); @@ -944,7 +944,7 @@ dissect_xmcp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) msg_length = tvb_get_ntohs(tvb, 2); if ((guint)(msg_length + XMCP_HDR_LEN) > tvb_reported_length(tvb)) { expert_add_info_format(pinfo, ti, &ei_xmcp_length_bad, "XMCP message length (%u-byte header + %u) exceeds packet length (%u)", XMCP_HDR_LEN, msg_length, tvb_reported_length(tvb)); - return; + return tvb_length(tvb); } /* ...a 4 byte magic cookie... */ @@ -1050,17 +1050,20 @@ dissect_xmcp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) expert_add_info_format(pinfo, xmcp_tree, &ei_xmcp_session_termination, "Session termination - %s %s", val_to_str_const(xmcp_msg_type_method, methods, ""), val_to_str_const(xmcp_msg_type_class, classes, "")); } } + + return tvb_length(tvb); } -static void -dissect_xmcp_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) +static int +dissect_xmcp_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) { tcp_dissect_pdus(tvb, pinfo, tree, TRUE, XMCP_HDR_LEN, - get_xmcp_message_len, dissect_xmcp_message); + get_xmcp_message_len, dissect_xmcp_message, data); + return tvb_length(tvb); } static gboolean -dissect_xmcp_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) +dissect_xmcp_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { /* See if this looks like a real XMCP packet */ if (tvb_length(tvb) < XMCP_HDR_LEN) { @@ -1077,7 +1080,7 @@ dissect_xmcp_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat /* Good enough to consider a match! */ tcp_dissect_pdus(tvb, pinfo, tree, TRUE, XMCP_HDR_LEN, - get_xmcp_message_len, dissect_xmcp_message); + get_xmcp_message_len, dissect_xmcp_message, data); return TRUE; } @@ -1373,7 +1376,7 @@ proto_reg_handoff_xmcp(void) static guint xmcp_tcp_port; if (!xmcp_prefs_initialized) { - xmcp_tcp_handle = create_dissector_handle(dissect_xmcp_tcp, proto_xmcp); + xmcp_tcp_handle = new_create_dissector_handle(dissect_xmcp_tcp, proto_xmcp); heur_dissector_add("tcp", dissect_xmcp_heur, proto_xmcp); media_type_dissector_table = find_dissector_table("media_type"); xmcp_prefs_initialized = TRUE; |