Revert r44559: go back to using g_malloc()'d memory for SCTP reassembly. That
authorJeff Morriss <jeff.morriss.ws@gmail.com>
Tue, 26 Feb 2013 02:36:05 +0000 (02:36 -0000)
committerJeff Morriss <jeff.morriss.ws@gmail.com>
Tue, 26 Feb 2013 02:36:05 +0000 (02:36 -0000)
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

epan/dissectors/packet-sctp.c

index d0d711e34aeba14bf4e362bdea00bdd76dfd19bb..fbb95dfb46211ff8c9256dcef543857c1b221c54 100644 (file)
@@ -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);