diff options
author | Jeff Morriss <jeff.morriss.ws@gmail.com> | 2013-02-26 02:36:05 +0000 |
---|---|---|
committer | Jeff Morriss <jeff.morriss.ws@gmail.com> | 2013-02-26 02:36:05 +0000 |
commit | b320eb3d971372d1293a5c072b2cb4b4e2300a0e (patch) | |
tree | 39ed4d0a3c45f6c947e968c0f9a8fad12ed626df /epan/dissectors | |
parent | 24eff41b082e5d5d92ea6515db960e5fa85de02d (diff) |
Revert r44559: go back to using g_malloc()'d memory for SCTP reassembly. That
way we don't keep two copies of the fragments in memory until the file is
closed.
wmem is probably a better alternative to this.
svn path=/trunk/; revision=47897
Diffstat (limited to 'epan/dissectors')
-rw-r--r-- | epan/dissectors/packet-sctp.c | 64 |
1 files changed, 58 insertions, 6 deletions
diff --git a/epan/dissectors/packet-sctp.c b/epan/dissectors/packet-sctp.c index d0d711e34a..fbb95dfb46 100644 --- a/epan/dissectors/packet-sctp.c +++ b/epan/dissectors/packet-sctp.c @@ -2147,11 +2147,58 @@ frag_hash(gconstpointer k) key->stream_id ^ key->stream_seq_num; } + + +static void +frag_free_msgs(sctp_frag_msg *msg) +{ + sctp_frag_be *beginend; + sctp_fragment *fragment; + + /* free all begins */ + while (msg->begins) { + beginend = msg->begins; + msg->begins = msg->begins->next; + g_free(beginend); + } + + /* free all ends */ + while (msg->ends) { + beginend = msg->ends; + msg->ends = msg->ends->next; + g_free(beginend); + } + + /* free all fragments */ + while (msg->fragments) { + fragment = msg->fragments; + msg->fragments = msg->fragments->next; + g_free(fragment->data); + g_free(fragment); + } + + /* msg->messages is se_ allocated, no need to free it */ + + g_free(msg); +} + +static gboolean +free_table_entry(gpointer key, gpointer value, gpointer user_data _U_) +{ + sctp_frag_msg *msg = value; + frag_key *fkey = key; + + frag_free_msgs(msg); + g_free(fkey); + return TRUE; +} + static void frag_table_init(void) { /* destroy an existing hash table and create a new one */ if (frag_table) { + g_hash_table_foreach_remove(frag_table, free_table_entry, NULL); g_hash_table_destroy(frag_table); frag_table=NULL; } @@ -2209,14 +2256,14 @@ add_fragment(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 tsn, msg = find_message(stream_id, stream_seq_num); if (!msg) { - msg = se_alloc (sizeof (sctp_frag_msg)); + msg = g_malloc (sizeof (sctp_frag_msg)); msg->begins = NULL; msg->ends = NULL; msg->fragments = NULL; msg->messages = NULL; msg->next = NULL; - key = se_alloc(sizeof (frag_key)); + key = g_malloc(sizeof (frag_key)); key->sport = sctp_info.sport; key->dport = sctp_info.dport; key->verification_tag = sctp_info.verification_tag; @@ -2256,12 +2303,12 @@ add_fragment(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 tsn, return NULL; /* create new fragment */ - fragment = se_alloc (sizeof (sctp_fragment)); + fragment = g_malloc (sizeof (sctp_fragment)); fragment->frame_num = pinfo->fd->num; fragment->tsn = tsn; fragment->len = tvb_length(tvb); fragment->next = NULL; - fragment->data = se_alloc (fragment->len); + fragment->data = g_malloc (fragment->len); tvb_memcpy(tvb, fragment->data, 0, fragment->len); /* add new fragment to linked list. sort ascending by tsn */ @@ -2285,7 +2332,7 @@ add_fragment(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 tsn, /* save begin or end if neccessary */ if (b_bit && !e_bit) { - beginend = se_alloc (sizeof (sctp_frag_be)); + beginend = g_malloc (sizeof (sctp_frag_be)); beginend->fragment = fragment; beginend->next = NULL; @@ -2310,7 +2357,7 @@ add_fragment(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 tsn, } if (!b_bit && e_bit) { - beginend = se_alloc (sizeof (sctp_frag_be)); + beginend = g_malloc (sizeof (sctp_frag_be)); beginend->fragment = fragment; beginend->next = NULL; @@ -2544,6 +2591,7 @@ fragment_reassembly(tvbuff_t *tvb, sctp_fragment* fragment, offset += frag_i->len; /* release fragment data */ + g_free(frag_i->data); frag_i->data = NULL; } @@ -2556,6 +2604,7 @@ fragment_reassembly(tvbuff_t *tvb, sctp_fragment* fragment, offset += frag_i->len; /* release fragment data */ + g_free(frag_i->data); frag_i->data = NULL; } @@ -2569,6 +2618,7 @@ fragment_reassembly(tvbuff_t *tvb, sctp_fragment* fragment, offset += frag_i->len; /* release fragment data */ + g_free(frag_i->data); frag_i->data = NULL; } } @@ -2594,6 +2644,7 @@ fragment_reassembly(tvbuff_t *tvb, sctp_fragment* fragment, if (beginend && beginend->next == begin) beginend->next = begin->next; } + g_free(begin); if (msg->ends == end) { msg->ends = end->next; @@ -2604,6 +2655,7 @@ fragment_reassembly(tvbuff_t *tvb, sctp_fragment* fragment, if (beginend && beginend->next == end) beginend->next = end->next; } + g_free(end); /* create data source */ new_tvb = tvb_new_child_real_data(tvb, message->data, len, len); |