diff options
author | gerald <gerald@f5534014-38df-0310-8fa8-9805f1628bb7> | 2005-04-19 14:17:22 +0000 |
---|---|---|
committer | gerald <gerald@f5534014-38df-0310-8fa8-9805f1628bb7> | 2005-04-19 14:17:22 +0000 |
commit | 679d8fe85ca1a72dc552e3b9240655b0be3a8923 (patch) | |
tree | 741a81dc35a972cb1905738ac032b304327af15d /epan/reassemble.c | |
parent | 9e463c1a8795c818f563d04879de2f3c557c8b32 (diff) |
From Peter Johansson: Fix a segmentation fault in the reassembly code.
Fix up the formatting a bit.
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@14136 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'epan/reassemble.c')
-rw-r--r-- | epan/reassemble.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/epan/reassemble.c b/epan/reassemble.c index b8d6a8ac15..fb8de997b7 100644 --- a/epan/reassemble.c +++ b/epan/reassemble.c @@ -725,13 +725,18 @@ fragment_add_work(fragment_data *fd_head, tvbuff_t *tvb, int offset, } /* dfpos is always >= than fd_i->offset */ /* No gaps can exist here, max_loop(above) does this */ - if( fd_i->offset+fd_i->len > dfpos ) - memcpy(fd_head->data+dfpos, fd_i->data+(dfpos-fd_i->offset), + if( fd_i->offset+fd_i->len > dfpos ) { + if( !(fd_i->flags & FD_NOT_MALLOCED) ) { + memcpy(fd_head->data+dfpos, fd_i->data+(dfpos-fd_i->offset), fd_i->len-(dfpos-fd_i->offset)); - if( fd_i->flags & FD_NOT_MALLOCED ) - fd_i->flags ^= FD_NOT_MALLOCED; - else - g_free(fd_i->data); + g_free(fd_i->data); + } else { + g_warning("Reassemble error in frame %d", pinfo->fd->num); + fd_i->flags ^= FD_NOT_MALLOCED; + } + } + + fd_i->data=NULL; dfpos=MAX(dfpos,(fd_i->offset+fd_i->len)); |