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;
}
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;
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 */
/* 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;
}
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;
offset += frag_i->len;
/* release fragment data */
+ g_free(frag_i->data);
frag_i->data = NULL;
}
offset += frag_i->len;
/* release fragment data */
+ g_free(frag_i->data);
frag_i->data = NULL;
}
offset += frag_i->len;
/* release fragment data */
+ g_free(frag_i->data);
frag_i->data = NULL;
}
}
if (beginend && beginend->next == begin)
beginend->next = begin->next;
}
+ g_free(begin);
if (msg->ends == end) {
msg->ends = end->next;
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);