diff options
-rw-r--r-- | epan/packet.c | 5 | ||||
-rw-r--r-- | packet-clnp.c | 14 | ||||
-rw-r--r-- | packet-frame.c | 39 | ||||
-rw-r--r-- | packet-ip.c | 8 | ||||
-rw-r--r-- | packet-ipv6.c | 6 | ||||
-rw-r--r-- | packet-smb-pipe.c | 6 | ||||
-rw-r--r-- | packet-smb.c | 40 | ||||
-rw-r--r-- | packet-wtp.c | 5 |
8 files changed, 90 insertions, 33 deletions
diff --git a/epan/packet.c b/epan/packet.c index 2d240d166f..4389353a86 100644 --- a/epan/packet.c +++ b/epan/packet.c @@ -1,7 +1,7 @@ /* packet.c * Routines for packet disassembly * - * $Id: packet.c,v 1.56 2002/01/05 04:12:16 gram Exp $ + * $Id: packet.c,v 1.57 2002/01/17 06:29:20 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -194,9 +194,10 @@ dissect_packet(epan_dissect_t *edt, union wtap_pseudo_header *pseudo_header, edt->pi.net_dst.type = AT_NONE; edt->pi.src.type = AT_NONE; edt->pi.dst.type = AT_NONE; - edt->pi.ethertype = 0; + edt->pi.ethertype = 0; edt->pi.ipproto = 0; edt->pi.ipxptype = 0; + edt->pi.fragmented = FALSE; edt->pi.in_error_pkt = FALSE; edt->pi.ptype = PT_NONE; edt->pi.srcport = 0; diff --git a/packet-clnp.c b/packet-clnp.c index 6eb70a489d..ac1cc1ca23 100644 --- a/packet-clnp.c +++ b/packet-clnp.c @@ -1,7 +1,7 @@ /* packet-clnp.c * Routines for ISO/OSI network and transport protocol packet disassembly * - * $Id: packet-clnp.c,v 1.44 2002/01/10 11:27:56 guy Exp $ + * $Id: packet-clnp.c,v 1.45 2002/01/17 06:29:16 guy Exp $ * Laurent Deniel <deniel@worldnet.fr> * Ralf Schneider <Ralf.Schneider@t-online.de> * @@ -1596,7 +1596,8 @@ static void dissect_clnp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) gboolean save_in_error_pkt; fragment_data *fd_head; tvbuff_t *volatile next_tvb; - gboolean update_col_info = TRUE; + gboolean update_col_info = TRUE; + gboolean save_fragmented; if (check_col(pinfo->cinfo, COL_PROTOCOL)) col_set_str(pinfo->cinfo, COL_PROTOCOL, "CLNP"); @@ -1822,6 +1823,7 @@ static void dissect_clnp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) /* If clnp_reassemble is on and this is a segment, then just add the segment * to the hashtable. */ + save_fragmented = pinfo->fragmented; if (clnp_reassemble && (cnf_type & CNF_SEG_OK) && ((cnf_type & CNF_MORE_SEGS) || segment_offset != 0)) { /* We're reassembling, and this is part of a segmented datagram. @@ -1962,6 +1964,7 @@ static void dissect_clnp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) /* As we haven't reassembled anything, we haven't changed "pi", so we don't have to restore it. */ call_dissector(data_handle,tvb_new_subset(tvb, offset,-1,tvb_reported_length_remaining(tvb,offset)), pinfo, tree); + pinfo->fragmented = save_fragmented; return; } @@ -1975,8 +1978,10 @@ static void dissect_clnp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) PDU, skip that? */ if (nsel == (char)tp_nsap_selector || always_decode_transport) { - if (dissect_ositp_internal(next_tvb, pinfo, tree, FALSE)) + if (dissect_ositp_internal(next_tvb, pinfo, tree, FALSE)) { + pinfo->fragmented = save_fragmented; return; /* yes, it appears to be COTP or CLTP */ + } } break; @@ -2043,6 +2048,7 @@ static void dissect_clnp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) pinfo->dst = save_dst; } } + pinfo->fragmented = save_fragmented; return; /* we're done with this PDU */ case ERQ_NPDU: @@ -2054,7 +2060,7 @@ static void dissect_clnp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if (check_col(pinfo->cinfo, COL_INFO)) col_add_fstr(pinfo->cinfo, COL_INFO, "%s NPDU %s", pdu_type_string, flag_string); call_dissector(data_handle,next_tvb, pinfo, tree); - + pinfo->fragmented = save_fragmented; } /* dissect_clnp */ static void diff --git a/packet-frame.c b/packet-frame.c index 951844a2a2..c95a2823c6 100644 --- a/packet-frame.c +++ b/packet-frame.c @@ -2,7 +2,7 @@ * * Top-most dissector. Decides dissector based on Wiretap Encapsulation Type. * - * $Id: packet-frame.c,v 1.17 2002/01/08 07:17:55 guy Exp $ + * $Id: packet-frame.c,v 1.18 2002/01/17 06:29:16 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -45,6 +45,7 @@ static int hf_frame_p2p_dir = -1; static int hf_frame_file_off = -1; static int proto_short = -1; int proto_malformed = -1; +static int proto_unreassembled = -1; static gint ett_frame = -1; @@ -157,10 +158,29 @@ dissect_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) "[Short Frame: %s]", pinfo->current_proto ); } CATCH(ReportedBoundsError) { - if (check_col(pinfo->cinfo, COL_INFO)) - col_append_str(pinfo->cinfo, COL_INFO, "[Malformed Packet]"); - proto_tree_add_protocol_format(tree, proto_malformed, tvb, 0, 0, - "[Malformed Packet: %s]", pinfo->current_proto ); + if (pinfo->fragmented) { + /* + * We were dissecting an unreassembled fragmented + * packet when the exception was thrown, so the + * problem isn't that the dissector expected + * something but it wasn't in the packet, the + * problem is that the dissector expected something + * but it wasn't in the fragment we dissected. + */ + if (check_col(pinfo->cinfo, COL_INFO)) + col_append_str(pinfo->cinfo, COL_INFO, + "[Unreassembled Fragmented Packet]"); + proto_tree_add_protocol_format(tree, proto_unreassembled, + tvb, 0, 0, "[Unreassembled Fragmented Packet: %s]", + pinfo->current_proto ); + } else { + if (check_col(pinfo->cinfo, COL_INFO)) + col_append_str(pinfo->cinfo, COL_INFO, + "[Malformed Packet]"); + proto_tree_add_protocol_format(tree, proto_malformed, + tvb, 0, 0, "[Malformed Packet: %s]", + pinfo->current_proto ); + } } ENDTRY; } @@ -224,11 +244,16 @@ proto_register_frame(void) proto_short = proto_register_protocol("Short Frame", "Short frame", "short"); proto_malformed = proto_register_protocol("Malformed Packet", "Malformed packet", "malformed"); + proto_unreassembled = proto_register_protocol( + "Unreassembled Fragmented Packet", + "Unreassembled fragmented packet", "unreassembled"); - /* "Short Frame" and "Malformed Packet" aren't really protocols, - they're error indications; disabling them makes no sense. */ + /* "Short Frame", "Malformed Packet", and "Unreassembled Fragmented + Packet" aren't really protocols, they're error indications; + disabling them makes no sense. */ proto_set_cant_disable(proto_short); proto_set_cant_disable(proto_malformed); + proto_set_cant_disable(proto_unreassembled); /* Our preferences */ frame_module = prefs_register_protocol(proto_frame, NULL); diff --git a/packet-ip.c b/packet-ip.c index 8793e96323..27ba0f0bb2 100644 --- a/packet-ip.c +++ b/packet-ip.c @@ -1,7 +1,7 @@ /* packet-ip.c * Routines for IP and miscellaneous IP protocol packet disassembly * - * $Id: packet-ip.c,v 1.155 2002/01/10 11:27:56 guy Exp $ + * $Id: packet-ip.c,v 1.156 2002/01/17 06:29:16 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -822,7 +822,8 @@ dissect_ip(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) guint16 ipsum; fragment_data *ipfd_head; tvbuff_t *next_tvb; - gboolean update_col_info = TRUE; + gboolean update_col_info = TRUE; + gboolean save_fragmented; if (check_col(pinfo->cinfo, COL_PROTOCOL)) col_set_str(pinfo->cinfo, COL_PROTOCOL, "IP"); @@ -968,6 +969,7 @@ dissect_ip(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) /* If ip_defragment is on and this is a fragment, then just add the fragment * to the hashtable. */ + save_fragmented = pinfo->fragmented; if (ip_defragment && (iph.ip_off & (IP_MF|IP_OFFSET))) { /* We're reassembling, and this is part of a fragmented datagram. Add the fragment to the hash table if the checksum is ok @@ -1105,6 +1107,7 @@ dissect_ip(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) col_add_fstr(pinfo->cinfo, COL_INFO, "Fragmented IP protocol (proto=%s 0x%02x, off=%u)", ipprotostr(iph.ip_p), iph.ip_p, (iph.ip_off & IP_OFFSET) * 8); call_dissector(data_handle,tvb_new_subset(tvb, offset,-1,tvb_reported_length_remaining(tvb,offset)), pinfo, tree); + pinfo->fragmented = save_fragmented; return; } @@ -1123,6 +1126,7 @@ dissect_ip(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) } call_dissector(data_handle,next_tvb, pinfo, tree); } + pinfo->fragmented = save_fragmented; } #define ICMP_MIP_EXTENSION_PAD 0 diff --git a/packet-ipv6.c b/packet-ipv6.c index 42c15a9d94..563f0d60be 100644 --- a/packet-ipv6.c +++ b/packet-ipv6.c @@ -1,7 +1,7 @@ /* packet-ipv6.c * Routines for IPv6 packet disassembly * - * $Id: packet-ipv6.c,v 1.72 2002/01/10 11:27:56 guy Exp $ + * $Id: packet-ipv6.c,v 1.73 2002/01/17 06:29:16 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -657,6 +657,7 @@ dissect_ipv6(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) fragment_data *ipfd_head; tvbuff_t *next_tvb; gboolean update_col_info = TRUE; + gboolean save_fragmented; struct ip6_hdr ipv6; @@ -809,6 +810,7 @@ again: /* If ipv6_reassemble is on and this is a fragment, then just add the fragment * to the hashtable. */ + save_fragmented = pinfo->fragmented; if (ipv6_reassemble && frag) { /* We're reassembling, and this is part of a fragmented datagram. Add the fragment to the hash table if the frame isn't truncated. */ @@ -946,6 +948,7 @@ again: /* As we haven't reassembled anything, we haven't changed "pi", so we don't have to restore it. */ + pinfo->fragmented = save_fragmented; return; } @@ -956,6 +959,7 @@ again: col_add_fstr(pinfo->cinfo, COL_INFO, "%s (0x%02x)", ipprotostr(nxt),nxt); call_dissector(data_handle,next_tvb, pinfo, tree); } + pinfo->fragmented = save_fragmented; } static void diff --git a/packet-smb-pipe.c b/packet-smb-pipe.c index 26445ae704..450d464542 100644 --- a/packet-smb-pipe.c +++ b/packet-smb-pipe.c @@ -8,7 +8,7 @@ XXX Fixme : shouldnt show [malformed frame] for long packets * significant rewrite to tvbuffify the dissector, Ronnie Sahlberg and * Guy Harris 2001 * - * $Id: packet-smb-pipe.c,v 1.63 2002/01/15 10:01:20 guy Exp $ + * $Id: packet-smb-pipe.c,v 1.64 2002/01/17 06:29:16 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -2540,6 +2540,7 @@ dissect_pipe_dcerpc(tvbuff_t *d_tvb, packet_info *pinfo, proto_tree *parent_tree dcerpc_private_info dcerpc_priv; smb_info_t *smb_priv = (smb_info_t *)pinfo->private_data; gboolean result; + gboolean save_fragmented; dcerpc_priv.transport_type = DCERPC_TRANSPORT_SMB; dcerpc_priv.data.smb.fid = fid; @@ -2554,6 +2555,8 @@ dissect_pipe_dcerpc(tvbuff_t *d_tvb, packet_info *pinfo, proto_tree *parent_tree pinfo->can_desegment=2; } + save_fragmented = pinfo->fragmented; + /* see if this packet is already desegmented */ if(smb_dcerpc_reassembly && pinfo->fd->flags.visited){ fragment_data *fd_head; @@ -2616,6 +2619,7 @@ dissect_pipe_dcerpc(tvbuff_t *d_tvb, packet_info *pinfo, proto_tree *parent_tree if (!result) call_dissector(data_handle, d_tvb, pinfo, parent_tree); + pinfo->fragmented = save_fragmented; return TRUE; } diff --git a/packet-smb.c b/packet-smb.c index aaa628cf99..94d0cbd64a 100644 --- a/packet-smb.c +++ b/packet-smb.c @@ -3,7 +3,7 @@ * Copyright 1999, Richard Sharpe <rsharpe@ns.aus.com> * 2001 Rewrite by Ronnie Sahlberg and Guy Harris * - * $Id: packet-smb.c,v 1.194 2002/01/15 10:01:20 guy Exp $ + * $Id: packet-smb.c,v 1.195 2002/01/17 06:29:16 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -7437,6 +7437,7 @@ dissect_nt_transaction_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t int padcnt; fragment_data *r_fd = NULL; tvbuff_t *pd_tvb=NULL; + gboolean save_fragmented; si = (smb_info_t *)pinfo->private_data; if (si->sip != NULL) @@ -7522,12 +7523,15 @@ dissect_nt_transaction_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t In this section we do reassembly of both the data and parameters blocks of the SMB transaction command. */ - if(smb_trans_reassembly){ - /* do we need reassembly? */ - if( (td&&(td!=dc)) || (tp&&(tp!=pc)) ){ - /* oh yeah, either data or parameter section needs - reassembly - */ + save_fragmented = pinfo->fragmented; + /* do we need reassembly? */ + if( (td&&(td!=dc)) || (tp&&(tp!=pc)) ){ + /* oh yeah, either data or parameter section needs + reassembly... + */ + pinfo->fragmented = TRUE; + if(smb_trans_reassembly){ + /* ...and we were told to do reassembly */ if(pc && ((unsigned int)tvb_length_remaining(tvb, po)>=pc) ){ r_fd = smb_trans_defragment(tree, pinfo, tvb, po, pc, pd, td+tp); @@ -7540,8 +7544,8 @@ dissect_nt_transaction_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t } } - /* if we got a reassembled fd structure from the reassembly routine we must - create pd_tvb from it + /* if we got a reassembled fd structure from the reassembly routine we + must create pd_tvb from it */ if(r_fd){ proto_tree *tr; @@ -7603,6 +7607,7 @@ dissect_nt_transaction_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t COUNT_BYTES(dc); } } + pinfo->fragmented = save_fragmented; END_OF_SMB @@ -11184,6 +11189,7 @@ dissect_transaction_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree fragment_data *r_fd = NULL; tvbuff_t *pd_tvb=NULL, *d_tvb=NULL, *p_tvb=NULL; tvbuff_t *s_tvb=NULL, *sp_tvb=NULL; + gboolean save_fragmented; si = (smb_info_t *)pinfo->private_data; @@ -11309,12 +11315,15 @@ dissect_transaction_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree In this section we do reassembly of both the data and parameters blocks of the SMB transaction command. */ - if(smb_trans_reassembly){ - /* do we need reassembly? */ - if( (td!=dc) || (tp!=pc) ){ - /* oh yeah, either data or parameter section needs - reassembly - */ + save_fragmented = pinfo->fragmented; + /* do we need reassembly? */ + if( (td!=dc) || (tp!=pc) ){ + /* oh yeah, either data or parameter section needs + reassembly + */ + pinfo->fragmented = TRUE; + if(smb_trans_reassembly){ + /* ...and we were told to do reassembly */ if(pc && (tvb_length_remaining(tvb, po)>=pc) ){ r_fd = smb_trans_defragment(tree, pinfo, tvb, po, pc, pd, td+tp); @@ -11492,6 +11501,7 @@ dissect_transaction_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree } } + pinfo->fragmented = save_fragmented; END_OF_SMB return offset; diff --git a/packet-wtp.c b/packet-wtp.c index 88c955ee1b..3fd9078f36 100644 --- a/packet-wtp.c +++ b/packet-wtp.c @@ -2,7 +2,7 @@ * * Routines to dissect WTP component of WAP traffic. * - * $Id: packet-wtp.c,v 1.24 2002/01/04 20:20:08 guy Exp $ + * $Id: packet-wtp.c,v 1.25 2002/01/17 06:29:17 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -510,10 +510,12 @@ dissect_wtp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { int dataOffset = offCur + cbHeader + vHeader; guint32 dataLen = tvb_length_remaining(tvb, offCur + cbHeader + vHeader); + gboolean save_fragmented; if ((pdut == SEGMENTED_INVOKE) || (pdut == SEGMENTED_RESULT) || (((pdut == INVOKE) || (pdut == RESULT)) && (!fTTR))) /* 1st part of segment */ { + save_fragmented = pinfo->fragmented; pinfo->fragmented = TRUE; fd_head = fragment_add_seq(tvb, dataOffset, pinfo, TID, wtp_fragment_table, psn, dataLen, !fTTR); @@ -533,6 +535,7 @@ dissect_wtp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if (check_col(pinfo->cinfo, COL_INFO)) /* Won't call WSP so display */ col_append_str(pinfo->cinfo, COL_INFO, szInfo ); } + pinfo->fragmented = save_fragmented; } else /* Normal packet, call next dissector */ { |