On Thu, Feb 13, 2003 at 10:38:44AM +0100, Bernd Becker wrote: > Hi Craig, > > your patch works fine with the GIOP captures I have tried (Visibroker > traffic mainly). > > A couple of changes though (mainly errors that were there before your > patch): > > - correct bitmask for hf_giop_iop_vscid and hf_giop_iop_scid, reflecting > the change > to a 24bit vendor id and 8 bit service id > - set the length of the "Service Context List" tree correctly after > dissecting. The > length was just being set to the end of the tvb > - do not exit the loop through the Service Context List with return if the > sequence length > is 0, continue the loop instead. This should fix a problem reported by > Mika Korpela. > (see http://www.ethereal.com/lists/ethereal-dev/200205/msg00234.html ) > I never really tested this though, because I don't have a capture with a > Service Context > List with more than one element.
Thanks for raising these issues. I believe the attached patch addresses all of them. -- Craig Rodrigues http://home.attbi.com/~rodrigc [EMAIL PROTECTED]
Index: packet-giop.c =================================================================== RCS file: /cvsroot/ethereal/packet-giop.c,v retrieving revision 1.66 diff -u -u -r1.66 packet-giop.c --- packet-giop.c 13 Feb 2003 01:23:35 -0000 1.66 +++ packet-giop.c 13 Feb 2003 17:05:05 -0000 @@ -4185,13 +4185,13 @@ { &hf_giop_iop_vscid, { "VSCID", "giop.iiop.vscid", - FT_UINT32, BASE_HEX, NULL, 0xfffff000, "", HFILL } + FT_UINT32, BASE_HEX, NULL, 0xffffff00, "", HFILL } } , { &hf_giop_iop_scid, { "SCID", "giop.iiop.scid", - FT_UINT32, BASE_HEX, NULL, 0x00000fff, "", HFILL } + FT_UINT32, BASE_HEX, NULL, 0x000000ff, "", HFILL } } , @@ -4732,14 +4732,14 @@ /* create a subtree */ + seqlen = get_CDR_ulong(tvb,offset,stream_is_be,boundary); if (ptree) { - tf = proto_tree_add_text (ptree, tvb, *offset, -1, "ServiceContextList"); + tf = proto_tree_add_text (ptree, tvb, *offset - sizeof(seqlen), sizeof(seqlen), "ServiceContextList"); tree = proto_item_add_subtree (tf, ett_giop_scl); } /* Get sequence length (number of elements) */ - seqlen = get_CDR_ulong(tvb,offset,stream_is_be,boundary); if (tree) { proto_tree_add_uint(tree,hf_giop_sequence_length,tvb, *offset-sizeof(seqlen),4,seqlen); @@ -4755,7 +4755,7 @@ for (i=0; i<seqlen; i++) { context_id = get_CDR_ulong(tvb,offset,stream_is_be,boundary); - vscid = context_id & 0xffffff00; /* vendor info, top 24 bits */ + vscid = (context_id & 0xffffff00) >> 8; /* vendor info, top 24 bits */ scid = context_id & 0x000000ff; /* standard service info, lower 8 bits */ service_context_name = match_strval(scid, service_context_ids); @@ -4773,21 +4773,22 @@ if( vscid != 0 || scid > max_service_context_id ) { decode_UnknownServiceContext(tvb, tree, offset, stream_is_be, boundary, vscid, scid); - return; - } - - if (tree) { - tf_st1 = proto_tree_add_text (tree, tvb, *offset, -1, service_context_name); - sub_tree1 = proto_item_add_subtree (tf_st1, ett_giop_scl_st1); + continue; } + temp_offset = *offset; /* get sequence length, new endianness and boundary for encapsulation */ seqlen_cd = get_CDR_encap_info(tvb, sub_tree1, offset, stream_is_be, boundary, &encapsulation_is_be , &encapsulation_boundary); + if (tree) { + tf_st1 = proto_tree_add_text (tree, tvb, temp_offset, sizeof(seqlen_cd) + seqlen_cd , service_context_name); + sub_tree1 = proto_item_add_subtree (tf_st1, ett_giop_scl_st1); + } + if (seqlen_cd == 0) - return; + continue; /* See CORBA 3.0.2 standard, section Section 15.3.3 "Encapsulation", * for how CDR types can be marshalled into a sequence<octet>.