aboutsummaryrefslogtreecommitdiffstats
path: root/asn1/t38
diff options
context:
space:
mode:
authorJakub Zawadzki <darkjames-ws@darkjames.pl>2013-07-14 14:42:05 +0000
committerJakub Zawadzki <darkjames-ws@darkjames.pl>2013-07-14 14:42:05 +0000
commitc766e78cfa1527ed242580b808635b0b5966cf3e (patch)
tree7a4318d94e33c292936eb8cffca5e5ff31e73c55 /asn1/t38
parentd924325d37c8724a447f76f8789063580bd86876 (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.c15
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;
}
}