summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--epan/dissectors/packet-tcp.c1
-rw-r--r--epan/packet.c15
-rw-r--r--epan/packet.h2
3 files changed, 18 insertions, 0 deletions
diff --git a/epan/dissectors/packet-tcp.c b/epan/dissectors/packet-tcp.c
index 7932eb34fd..8db6b49348 100644
--- a/epan/dissectors/packet-tcp.c
+++ b/epan/dissectors/packet-tcp.c
@@ -1889,6 +1889,7 @@ again:
* being a new higher-level PDU that also
* needs desegmentation).
*/
+ remove_last_data_source(pinfo);
fragment_set_partial_reassembly(&tcp_reassembly_table,
pinfo, msp->first_frame, NULL);
diff --git a/epan/packet.c b/epan/packet.c
index b3a5cc13da..e89ab312df 100644
--- a/epan/packet.c
+++ b/epan/packet.c
@@ -324,9 +324,24 @@ add_new_data_source(packet_info *pinfo, tvbuff_t *tvb, const char *name)
src = g_slice_new(struct data_source);
src->tvb = tvb;
src->name = g_strdup(name);
+ /* This could end up slow, but we should never have that many data
+ * sources so it probably doesn't matter */
pinfo->data_src = g_slist_append(pinfo->data_src, src);
}
+void
+remove_last_data_source(packet_info *pinfo)
+{
+ struct data_source *src;
+ GSList *last;
+
+ last = g_slist_last(pinfo->data_src);
+ src = (struct data_source *)last->data;
+ pinfo->data_src = g_slist_delete_link(pinfo->data_src, last);
+ g_free(src->name);
+ g_slice_free(struct data_source, src);
+}
+
const char*
get_data_source_name(const struct data_source *src)
{
diff --git a/epan/packet.h b/epan/packet.h
index af178b81e1..47d0acc0f0 100644
--- a/epan/packet.h
+++ b/epan/packet.h
@@ -512,6 +512,8 @@ final_registration_all_protocols(void);
*/
WS_DLL_PUBLIC void add_new_data_source(packet_info *pinfo, tvbuff_t *tvb,
const char *name);
+/* Removes the last-added data source, if it turns out it wasn't needed */
+WS_DLL_PUBLIC void remove_last_data_source(packet_info *pinfo);
/*