Ethereal-dev: [Ethereal-dev] Patch to packet-fcip.c
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Dinesh G Dutt <ddutt@xxxxxxxxx>
Date: Tue, 2 Sep 2003 11:15:56 -0700
Hi, This is a bugfix to packet-fcip.c. Without this patch, ethereal hangs with some FCIP captures. The patch also includes some cleanups. Dinesh --
Index: packet-fcip.c =================================================================== RCS file: /cvsroot/ethereal/packet-fcip.c,v retrieving revision 1.4 diff -u -r1.4 packet-fcip.c --- packet-fcip.c 9 Jul 2003 06:24:48 -0000 1.4 +++ packet-fcip.c 2 Sep 2003 18:14:42 -0000 @@ -103,16 +103,6 @@ {0, NULL}, }; -static const gchar * sof_strings[] = { - "SOFf", "SOFi4", "", "", "", "SOFi2", "SOFi3", "", "", "SOFn4", "", "", "", - "SOFn2", "SOFn3", "", "", "SOFc4", "", -}; - -static const gchar *eof_strings[] = { - "EOFn", "EOFt", "", "EOFrt", "", "EOFdt", "", "", "EOFni", "", "", "", "", - "EOFdti", "EOFrti", "EOFa", "", -}; - static guint fcip_header_2_bytes[2] = {FCIP_ENCAP_PROTO_VER, FCIP_ENCAP_PROTO_VER}; @@ -385,7 +375,7 @@ gint offset = 0, start = 0, frame_len = 0; - guint bytes_remaining = tvb_length_remaining (tvb, offset); + gint bytes_remaining = tvb_length_remaining (tvb, offset); guint8 pflags, sof, eof; /* Set up structures needed to add the protocol subtree and manage it */ proto_item *ti; @@ -417,6 +407,22 @@ col_set_str(pinfo->cinfo, COL_PROTOCOL, "FCIP"); frame_len = (tvb_get_ntohs (tvb, offset+12) & 0x03FF)*4; + + if (bytes_remaining < frame_len) { + if(fcip_desegment && pinfo->can_desegment) { + /* + * This frame doesn't have all of the data for + * this message, but we can do reassembly on it. + * + * Tell the TCP dissector where the data for this + * message starts in the data it handed us, and + * how many more bytes we need, and return. + */ + pinfo->desegment_offset = offset; + pinfo->desegment_len = frame_len - bytes_remaining; + return (TRUE); + } + } pflags = tvb_get_guint8 (tvb, start+8); @@ -426,22 +432,27 @@ FCIP_ENCAP_HEADER_LEN, "FCIP"); } - else { - sof = tvb_get_guint8 (tvb, offset+FCIP_ENCAP_HEADER_LEN) - 0x28; - eof = tvb_get_guint8 (tvb, offset+frame_len - 4) - 0x41; + else if (tvb_bytes_exist (tvb, offset, offset+frame_len-4)) { + sof = tvb_get_guint8 (tvb, offset+FCIP_ENCAP_HEADER_LEN); + eof = tvb_get_guint8 (tvb, offset+frame_len - 4); - if (sof > 18) { - sof = 18; /* The last SOF */ - } - if (eof > 15) { - eof = 16; - } + ti = proto_tree_add_protocol_format (tree, proto_fcip, tvb, 0, + FCIP_ENCAP_HEADER_LEN, + "FCIP (%s/%s)", + val_to_str (sof, fcip_sof_vals, + "0x%x"), + val_to_str (eof, fcip_eof_vals, + "0x%x")); + } + else { + sof = tvb_get_guint8 (tvb, offset+FCIP_ENCAP_HEADER_LEN); ti = proto_tree_add_protocol_format (tree, proto_fcip, tvb, 0, FCIP_ENCAP_HEADER_LEN, "FCIP (%s/%s)", - sof_strings[sof], - eof_strings[eof]); + val_to_str (sof, fcip_sof_vals, + "0x%x"), + "NA"); } fcip_tree = proto_item_add_subtree (ti, ett_fcip); /* Dissect the Common FC Encap header */ @@ -456,8 +467,10 @@ /* print EOF */ offset += (frame_len-FCIP_ENCAP_HEADER_LEN-4); - proto_tree_add_item (fcip_tree, hf_fcip_eof, tvb, offset, 1, 0); - proto_tree_add_item (fcip_tree, hf_fcip_eof_c, tvb, offset+2, 1, 0); + if (tvb_bytes_exist (tvb, offset, 4)) { + proto_tree_add_item (fcip_tree, hf_fcip_eof, tvb, offset, 1, 0); + proto_tree_add_item (fcip_tree, hf_fcip_eof_c, tvb, offset+2, 1, 0); + } } }
-- Much unhappiness results from our inability to remember the nice things that happen to us. - W. N. Rieger
- Follow-Ups:
- Re: [Ethereal-dev] Patch to packet-fcip.c
- From: Guy Harris
- Re: [Ethereal-dev] Patch to packet-fcip.c
- Prev by Date: Re: [Ethereal-dev] [PATCH] Wish list item 17 (packet generator)
- Next by Date: [Ethereal-dev] Another Windows-only sniffer: PacScope ...
- Previous by thread: Re: R: [Ethereal-dev] [PATCH] Wish list item 17 (packet generator)
- Next by thread: Re: [Ethereal-dev] Patch to packet-fcip.c
- Index(es):