diff options
author | Sake Blok <sake@euronet.nl> | 2009-12-21 06:47:32 +0000 |
---|---|---|
committer | Sake Blok <sake@euronet.nl> | 2009-12-21 06:47:32 +0000 |
commit | 3b6cb4d3fa9565aa758588e2ae7c08d4818386eb (patch) | |
tree | 36d487fe401fc39e0a2860be13cfb58a59d7a28a /epan/follow.c | |
parent | 52c02f4eb8b315f08633af8b3cd1841bf8956362 (diff) |
Fix some [-XX bytes missing in capture file] messages when doing
follow TCP stream.
svn path=/trunk/; revision=31334
Diffstat (limited to 'epan/follow.c')
-rw-r--r-- | epan/follow.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/epan/follow.c b/epan/follow.c index 437f24fa17..d351164a74 100644 --- a/epan/follow.c +++ b/epan/follow.c @@ -281,7 +281,7 @@ reassemble_tcp( guint32 tcp_stream, gulong sequence, gulong acknowledgement, } else { /* out of order packet */ - if(data_length > 0 && sequence > seq[src_index] ) { + if(data_length > 0 && ((glong)(sequence - seq[src_index]) > 0) ) { tmp_frag = (tcp_frag *)g_malloc( sizeof( tcp_frag ) ); tmp_frag->data = (gchar *)g_malloc( data_length ); tmp_frag->seq = sequence; @@ -336,15 +336,19 @@ check_fragments( int index, tcp_stream_chunk *sc, gulong acknowledged ) { } seq[index] += (current->len - new_pos); - if( prev ) { - prev->next = current->next; - } else { - frags[index] = current->next; - } - g_free( current->data ); - g_free( current ); - return 1; + } + + /* Remove the fragment from the list as the "new" part of it + * has been processed or its data has been seen already in + * another packet. */ + if( prev ) { + prev->next = current->next; + } else { + frags[index] = current->next; } + g_free( current->data ); + g_free( current ); + return 1; } if( current->seq == seq[index] ) { |