aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Morriss <jeff.morriss.ws@gmail.com>2013-02-26 02:36:05 +0000
committerJeff Morriss <jeff.morriss.ws@gmail.com>2013-02-26 02:36:05 +0000
commitb320eb3d971372d1293a5c072b2cb4b4e2300a0e (patch)
tree39ed4d0a3c45f6c947e968c0f9a8fad12ed626df
parent24eff41b082e5d5d92ea6515db960e5fa85de02d (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
-rw-r--r--epan/dissectors/packet-sctp.c64
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);