Wireshark-dev: [Wireshark-dev] Problemems with proto_tree_new_item after update
From: "Sebastian Breilmann" <mail@xxxxxxxxxxxxx>
Date: Wed, 19 Dec 2007 13:14:28 +0100
Hallo! After an update from 0.99.6 to 0.99.7 I have problems with a custom dissector I wrote. On 0.99.6 everything was fine, but now I get the mssage "[Dissector bug, protocol RTSU: proto.c:1064: failed assertion "length == 6"]". I have no idea to solve this :( Below is my disscetor-Source. Thank you for your help! /***Source*******************************************************/ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include <stdio.h> #include <glib.h> #include <epan/packet.h> #include <epan/dissectors/packet-tcp.h> #include <string.h> #include "units.h" #define PROTO_TAG_RTSU "RTSU" #define FRAME_HEADER_LEN 4 // Minumum amount of bytes in PDU to determine RTSU Packet length static void dissect_rtsu_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); static void dissect_rtsu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); static guint get_rtsu_message_len(packet_info *pinfo, tvbuff_t *tvb, int offset); static guint get_rtsu_pdu_len(packet_info *pinfo, tvbuff_t *tvb, int offset); static int proto_rtsu = -1; static dissector_handle_t data_handle=NULL; static dissector_handle_t rtsu_handle; void dissect_rtsu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); static int global_rtsu_port = 5555; static gint hf_rtsu = -1; static gint hf_rtsu_units = -1; static gint hf_rtsu_length = -1; static gint hf_rtsu_ulength = -1; static gint hf_rtsu_group = -1; static gint hf_rtsu_unit = -1; static gint hf_rtsu_data = -1; static gint ett_rtsu = -1; static gint ett_rtsu_units = -1; static gint ett_rtsu_length = -1; static gint ett_rtsu_ulength = -1; static gint ett_rtsu_group = -1; static gint ett_rtsu_unit = -1; static gint ett_rtsu_data = -1; void proto_reg_handoff_rtsu(void) { static gboolean initialized=FALSE; if (!initialized) { data_handle = find_dissector("data"); rtsu_handle = create_dissector_handle(dissect_rtsu, proto_rtsu); dissector_add("tcp.port", global_rtsu_port, rtsu_handle); } } void proto_register_rtsu (void) { /*Register Items: (according to Packet Def. and Unit Def.) &hf_rtsu: Whole PDU &hf_rtsu_units: Tree Item 'Units' &hf_rtsu_length: Packet LEN &hf_rtsu_ulength: Unit LEN &hf_rtsu_group: First byte of ID &hf_rtsu_unit: Second byte if ID &hf_rtsu_data: Data in Unit */ static hf_register_info hf[] = { { &hf_rtsu, { "Data", "rtsu.data", FT_NONE, BASE_NONE, NULL, 0x0, "RTSU PDU", HFILL }}, { &hf_rtsu_units, { "Units", "rtsu.units", FT_NONE, BASE_NONE, NULL, 0x0, "RTSU Units", HFILL }}, { &hf_rtsu_length, { "Packet Length", "rtsu.len", FT_UINT32, BASE_DEC, NULL, 0x0, "Packet Length", HFILL }}, { &hf_rtsu_ulength, { "Unit Length", "rtsu.ulen", FT_UINT32, BASE_DEC, NULL, 0x0, "Unit Length", HFILL }}, { &hf_rtsu_group, { "Group", "rtsu.group", FT_UINT8, BASE_DEC, VALS(packetgroupnames), 0x0, "Group", HFILL }}, { &hf_rtsu_unit, { "Unit", "rtsu.unit", FT_UINT8, BASE_DEC, VALS(group20unitnames), 0x0, "Unit", HFILL }}, { &hf_rtsu_data, { "Data", "rtsu.data", FT_BYTES, BASE_NONE, NULL, 0x0, "Data", HFILL }} }; static gint *ett[] = { &ett_rtsu, &ett_rtsu_units, &ett_rtsu_length, &ett_rtsu_ulength, &ett_rtsu_group, &ett_rtsu_unit, &ett_rtsu_data }; proto_rtsu = proto_register_protocol ("RTSU Protocol", "RTSU", "rtsu"); proto_register_field_array (proto_rtsu, hf, array_length (hf)); proto_register_subtree_array (ett, array_length (ett)); register_dissector("rtsu", dissect_rtsu, proto_rtsu); //} } //Determine the Unit Length static guint get_rtsu_len(packet_info *pinfo, tvbuff_t *tvb, int offset) { guint8 l1,l2=0; guint length=0; tvb_memcpy(tvb, &l1 , offset+1, 1); tvb_memcpy(tvb, &l2 , offset, 1); length=256*l2+l1; return length; } //Determine the Packet Length static guint get_rtsu_pdu_len(packet_info *pinfo, tvbuff_t *tvb, int offset) { guint8 l1,l2=0; guint length=0; tvb_memcpy(tvb, &l1 , offset+3, 1); tvb_memcpy(tvb, &l2 , offset+2, 1); length=256*l2+l1+6; return length; } //Dissector Call static void dissect_rtsu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { //Reassembling tcp_dissect_pdus(tvb, pinfo, tree, TRUE, FRAME_HEADER_LEN, get_rtsu_pdu_len, dissect_rtsu_message); } //Main Dissector Function static void dissect_rtsu_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { proto_item *rtsu_item = NULL; proto_item *rtsu_sub_item = NULL; proto_tree *rtsu_tree = NULL; proto_tree *rtsu_units_tree = NULL; guint16 firstbyte,secondbyte = 0; guint16 group = 0; guint16 unit = 0; if (check_col(pinfo->cinfo, COL_PROTOCOL)) col_set_str(pinfo->cinfo, COL_PROTOCOL, PROTO_TAG_RTSU); if(check_col(pinfo->cinfo,COL_INFO)){ col_clear(pinfo->cinfo,COL_INFO); } firstbyte = tvb_get_guint8( tvb, 0 ); secondbyte = tvb_get_guint8( tvb, 1 ); group = tvb_get_guint8( tvb, 6 ); // Get the (first) group byte to present it in the Info Col if (check_col(pinfo->cinfo, COL_INFO)) { //First and Second Byte should be 0xFA, otherwise it seems not to be a RTSU Unit if ((firstbyte==secondbyte) && (firstbyte == 250)) { col_add_fstr(pinfo->cinfo, COL_INFO, "%s", val_to_str(group, packetgroupnames, "Unknown Group:0x%02x")); } else col_add_fstr(pinfo->cinfo, COL_INFO,"no RTSU Unit"); } //More Information if (tree) { guint32 offset = 0; //current postition in PDU guint32 length=0,ulength = 0; //The First tree entry is the wohle packet length rtsu_item = proto_tree_add_item(tree, proto_rtsu, tvb, 0, -1, FALSE); rtsu_tree = proto_item_add_subtree(rtsu_item, ett_rtsu); offset+=2; length = get_rtsu_len(pinfo, tvb, offset); proto_tree_add_uint(rtsu_tree, hf_rtsu_length, tvb, offset, 2, length); offset+=2; //The next entry is the sub item 'Units' rtsu_units_tree = proto_item_add_subtree(rtsu_item, ett_rtsu); rtsu_sub_item = proto_tree_add_item( rtsu_tree, hf_rtsu_units, tvb, offset, length, FALSE ); rtsu_units_tree = proto_item_add_subtree(rtsu_sub_item, ett_rtsu); //While there are units left in packet while (offset<length+4) { group = tvb_get_guint8( tvb, 6 + offset -4); // Get the group byte unit = tvb_get_guint8( tvb, 7 + offset -4); // Get the unit byte unit=group*100+unit;// Encode to Unit ID ulength = get_rtsu_len(pinfo, tvb, offset); //Get the length of the unit proto_tree_add_uint(rtsu_units_tree, hf_rtsu_ulength, tvb, offset, 2, ulength); //present unit length offset+=2; proto_tree_add_item(rtsu_units_tree, hf_rtsu_group, tvb, offset, 1, FALSE); //present unit group offset++; proto_tree_add_uint(rtsu_units_tree, hf_rtsu_unit, tvb, offset, 1, unit); //present unit name offset++; proto_tree_add_item( rtsu_units_tree, hf_rtsu_data, tvb, offset, ulength, FALSE );//present unit data offset+=ulength; } } } //End of RTSU dissector function
- Follow-Ups:
- Re: [Wireshark-dev] Problemems with proto_tree_new_item after update
- From: Jaap Keuter
- Re: [Wireshark-dev] Problemems with proto_tree_new_item after update
- Prev by Date: Re: [Wireshark-dev] asn1/*/Makefile.nmake files missing in source distribution
- Next by Date: [Wireshark-dev] undefined symbol: h225_ReleaseCompleteReason_vals
- Previous by thread: Re: [Wireshark-dev] asn1/*/Makefile.nmake files missing in source distribution
- Next by thread: Re: [Wireshark-dev] Problemems with proto_tree_new_item after update
- Index(es):