diff options
author | Jakub Zawadzki <darkjames-ws@darkjames.pl> | 2013-07-14 14:42:05 +0000 |
---|---|---|
committer | Jakub Zawadzki <darkjames-ws@darkjames.pl> | 2013-07-14 14:42:05 +0000 |
commit | c766e78cfa1527ed242580b808635b0b5966cf3e (patch) | |
tree | 7a4318d94e33c292936eb8cffca5e5ff31e73c55 /asn1/t38 | |
parent | d924325d37c8724a447f76f8789063580bd86876 (diff) |
Rewrite reassemble API to use TVBs instead of raw data.
(it seems to be working for TCP ^^)
svn path=/trunk/; revision=50580
Diffstat (limited to 'asn1/t38')
-rw-r--r-- | asn1/t38/packet-t38-template.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/asn1/t38/packet-t38-template.c b/asn1/t38/packet-t38-template.c index 84f130b111..943a5fab57 100644 --- a/asn1/t38/packet-t38-template.c +++ b/asn1/t38/packet-t38-template.c @@ -299,6 +299,7 @@ force_reassemble_seq(reassembly_table *table, packet_info *pinfo, guint32 id) fragment_data *fd_i; fragment_data *last_fd; guint32 dfpos, size, packet_lost, burst_lost, seq_num; + char *data; fd_head = fragment_get(table, pinfo, id, NULL); @@ -341,7 +342,9 @@ force_reassemble_seq(reassembly_table *table, packet_info *pinfo, guint32 id) } last_fd=fd_i; } - fd_head->data = (char *)g_malloc(size); + + data = g_malloc(size); + fd_head->tvb_data = tvb_new_real_data(data, size, size); fd_head->len = size; /* record size for caller */ /* add all data fragments */ @@ -350,14 +353,14 @@ force_reassemble_seq(reassembly_table *table, packet_info *pinfo, guint32 id) for (fd_i=fd_head->next;fd_i && fd_i->len + dfpos <= size;fd_i=fd_i->next) { if (fd_i->len) { if(!last_fd || last_fd->offset!=fd_i->offset){ - memcpy(fd_head->data+dfpos,fd_i->data,fd_i->len); + memcpy(data+dfpos,tvb_get_ptr(fd_i->tvb_data,0,fd_i->len),fd_i->len); 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) ){ + || tvb_memeql(last_fd->tvb_data, 0, tvb_get_ptr(fd_i->tvb_data, 0, last_fd->len), last_fd->len) ){ fd_i->flags |= FD_OVERLAPCONFLICT; fd_head->flags |= FD_OVERLAPCONFLICT; } @@ -368,9 +371,9 @@ force_reassemble_seq(reassembly_table *table, packet_info *pinfo, guint32 id) /* we have defragmented the pdu, now free all fragments*/ for (fd_i=fd_head->next;fd_i;fd_i=fd_i->next) { - if(fd_i->data){ - g_free(fd_i->data); - fd_i->data=NULL; + if(fd_i->tvb_data){ + tvb_free(fd_i->tvb_data); + fd_i->tvb_data=NULL; } } |