aboutsummaryrefslogtreecommitdiffstats
path: root/reassemble.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2002-10-17 21:14:17 +0000
committerGuy Harris <guy@alum.mit.edu>2002-10-17 21:14:17 +0000
commit18dd6eff9e2a1b428ff53bfebb70d3f27bf1b1fc (patch)
tree4043ce86c84b16f1fd90dc10d703db9b6b79b954 /reassemble.c
parent3618a128a603e620ffa59614f7cc4fe16facc40b (diff)
Flag fragment overlaps when reassembling based on sequence number, and,
when displaying the fragment tree for reassembly based on sequence number, show the correct offset. svn path=/trunk/; revision=6448
Diffstat (limited to 'reassemble.c')
-rw-r--r--reassemble.c32
1 files changed, 20 insertions, 12 deletions
diff --git a/reassemble.c b/reassemble.c
index 45e9cd1158..6ee00863ea 100644
--- a/reassemble.c
+++ b/reassemble.c
@@ -1,7 +1,7 @@
/* reassemble.c
* Routines for {fragment,segment} reassembly
*
- * $Id: reassemble.c,v 1.24 2002/10/17 20:51:35 guy Exp $
+ * $Id: reassemble.c,v 1.25 2002/10/17 21:14:17 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -814,6 +814,8 @@ fragment_add_seq_work(fragment_data *fd_head, tvbuff_t *tvb, int offset,
dfpos += fd_i->len;
} else {
/* duplicate/retransmission/overlap */
+ fd_i->flags |= FD_OVERLAP;
+ fd_head->flags |= FD_OVERLAP;
if( (last_fd->len!=fd_i->datalen)
|| memcmp(last_fd->data, fd_i->data, last_fd->len) ){
fd->flags |= FD_OVERLAPCONFLICT;
@@ -1198,16 +1200,16 @@ show_fragment_tree(fragment_data *fd_head, fragment_items *fit,
proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb)
{
fragment_data *fd;
- proto_tree *ft=NULL;
- proto_item *fi=NULL;
+ proto_tree *ft;
+ proto_item *fi;
/* It's not fragmented. */
pinfo->fragmented = FALSE;
fi = proto_tree_add_item(tree, *(fit->hf_fragments),
- tvb, 0, -1, FALSE);
+ tvb, 0, -1, FALSE);
ft = proto_item_add_subtree(fi, *(fit->ett_fragments));
- for (fd=fd_head->next; fd; fd=fd->next)
+ for (fd = fd_head->next; fd != NULL; fd = fd->next)
show_fragment(fd, fd->offset, fit, ft, tvb);
return show_fragment_errs_in_col(fd_head, fit, pinfo);
@@ -1223,21 +1225,27 @@ gboolean
show_fragment_seq_tree(fragment_data *fd_head, fragment_items *fit,
proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb)
{
- guint32 offset;
- fragment_data *fd;
- proto_tree *ft=NULL;
- proto_item *fi=NULL;
+ guint32 offset, next_offset;
+ fragment_data *fd, *last_fd;
+ proto_tree *ft;
+ proto_item *fi;
/* It's not fragmented. */
pinfo->fragmented = FALSE;
fi = proto_tree_add_item(tree, *(fit->hf_fragments),
- tvb, 0, -1, FALSE);
+ tvb, 0, -1, FALSE);
ft = proto_item_add_subtree(fi, *(fit->ett_fragments));
offset = 0;
- for (fd=fd_head->next; fd; fd=fd->next){
+ next_offset = 0;
+ last_fd = NULL;
+ for (fd = fd_head->next; fd != NULL; fd = fd->next){
+ if (last_fd == NULL || last_fd->offset != fd->offset) {
+ offset = next_offset;
+ next_offset += fd->len;
+ }
+ last_fd = fd;
show_fragment(fd, offset, fit, ft, tvb);
- offset += fd->len;
}
return show_fragment_errs_in_col(fd_head, fit, pinfo);