aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
Diffstat (limited to 'epan')
-rw-r--r--epan/dissectors/packet-erf.c6
-rw-r--r--epan/dissectors/packet-sctp.c12
-rw-r--r--epan/dissectors/packet-umts_rlc.c2
-rw-r--r--epan/epan.c2
-rw-r--r--epan/frame_data.c6
-rw-r--r--epan/frame_data.h1
-rw-r--r--epan/frame_data_sequence.c1
-rw-r--r--epan/packet.c6
-rw-r--r--epan/packet.h2
-rw-r--r--epan/packet_info.h2
-rw-r--r--epan/reassemble.c2
11 files changed, 23 insertions, 19 deletions
diff --git a/epan/dissectors/packet-erf.c b/epan/dissectors/packet-erf.c
index c85aa31f40..2f00a385e1 100644
--- a/epan/dissectors/packet-erf.c
+++ b/epan/dissectors/packet-erf.c
@@ -1879,7 +1879,7 @@ static void dissect_host_anchor_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree
proto_item_set_generated(pi);
/* XXX: Need to do this each time because pinfo is discarded. Filtering does not reset visited as it does not do a full redissect.
We also might not catch all frames in the first pass (e.g. comment after record). */
- mark_frame_as_depended_upon(pinfo, anchored_info->frame_num);
+ mark_frame_as_depended_upon(pinfo->fd, anchored_info->frame_num);
}
frame = wmem_list_frame_next(frame);
}
@@ -1925,12 +1925,12 @@ dissect_host_id_source_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, g
pi = proto_tree_add_uint(hostid_tree, hf_erf_source_next, tvb, 0, 0, fnum_next);
proto_item_set_generated(pi);
/* XXX: Save the surrounding nearest periodic records when we do a filtered save so we keep native ERF metadata */
- mark_frame_as_depended_upon(pinfo, fnum_next);
+ mark_frame_as_depended_upon(pinfo->fd, fnum_next);
}
if (fnum != G_MAXUINT32) {
pi = proto_tree_add_uint(hostid_tree, hf_erf_source_prev, tvb, 0, 0, fnum);
proto_item_set_generated(pi);
- mark_frame_as_depended_upon(pinfo, fnum);
+ mark_frame_as_depended_upon(pinfo->fd, fnum);
}
}
}
diff --git a/epan/dissectors/packet-sctp.c b/epan/dissectors/packet-sctp.c
index 6b33a9afc5..b1355d9e89 100644
--- a/epan/dissectors/packet-sctp.c
+++ b/epan/dissectors/packet-sctp.c
@@ -2919,7 +2919,7 @@ fragment_reassembly(tvbuff_t *tvb, sctp_fragment *fragment,
frag_i->frame_num, offset, offset + frag_i->len - 1, frag_i->len);
offset += frag_i->len;
- mark_frame_as_depended_upon(pinfo, frag_i->frame_num);
+ mark_frame_as_depended_upon(pinfo->fd, frag_i->frame_num);
}
for (frag_i = msg->fragments;
@@ -2931,7 +2931,7 @@ fragment_reassembly(tvbuff_t *tvb, sctp_fragment *fragment,
frag_i->frame_num, offset, offset + frag_i->len - 1, frag_i->len);
offset += frag_i->len;
- mark_frame_as_depended_upon(pinfo, frag_i->frame_num);
+ mark_frame_as_depended_upon(pinfo->fd, frag_i->frame_num);
}
} else {
for (frag_i = find_fragment(message->begin, stream_id, stream_seq_num, u_bit);
@@ -2943,7 +2943,7 @@ fragment_reassembly(tvbuff_t *tvb, sctp_fragment *fragment,
frag_i->frame_num, offset, offset + frag_i->len - 1, frag_i->len);
offset += frag_i->len;
- mark_frame_as_depended_upon(pinfo, frag_i->frame_num);
+ mark_frame_as_depended_upon(pinfo->fd, frag_i->frame_num);
}
}
@@ -3158,7 +3158,7 @@ fragment_reassembly(tvbuff_t *tvb, sctp_fragment *fragment,
frag_i->frame_num, offset, offset + frag_i->len - 1, frag_i->len);
offset += frag_i->len;
- mark_frame_as_depended_upon(pinfo, frag_i->frame_num);
+ mark_frame_as_depended_upon(pinfo->fd, frag_i->frame_num);
}
for (frag_i = msg->fragments;
@@ -3170,7 +3170,7 @@ fragment_reassembly(tvbuff_t *tvb, sctp_fragment *fragment,
frag_i->frame_num, offset, offset + frag_i->len - 1, frag_i->len);
offset += frag_i->len;
- mark_frame_as_depended_upon(pinfo, frag_i->frame_num);
+ mark_frame_as_depended_upon(pinfo->fd, frag_i->frame_num);
}
} else {
for (frag_i = find_fragment(message->begin, stream_id, stream_seq_num, u_bit);
@@ -3182,7 +3182,7 @@ fragment_reassembly(tvbuff_t *tvb, sctp_fragment *fragment,
frag_i->frame_num, offset, offset + frag_i->len - 1, frag_i->len);
offset += frag_i->len;
- mark_frame_as_depended_upon(pinfo, frag_i->frame_num);
+ mark_frame_as_depended_upon(pinfo->fd, frag_i->frame_num);
}
}
diff --git a/epan/dissectors/packet-umts_rlc.c b/epan/dissectors/packet-umts_rlc.c
index 90168237a0..098cb59ee4 100644
--- a/epan/dissectors/packet-umts_rlc.c
+++ b/epan/dissectors/packet-umts_rlc.c
@@ -611,7 +611,7 @@ tree_add_fragment_list(struct rlc_sdu *sdu, tvbuff_t *tvb,packet_info *pinfo, pr
sdufrag->frame_num, sdufrag->seq);
}
- mark_frame_as_depended_upon(pinfo, sdufrag->frame_num);
+ mark_frame_as_depended_upon(pinfo->fd, sdufrag->frame_num);
offset += sdufrag->len;
sdufrag = sdufrag->next;
diff --git a/epan/epan.c b/epan/epan.c
index a7ef10e85b..db3b8720a7 100644
--- a/epan/epan.c
+++ b/epan/epan.c
@@ -573,7 +573,6 @@ epan_dissect_reset(epan_dissect_t *edt)
wtap_block_unref(edt->pi.rec->block);
g_slist_free(edt->pi.proto_data);
- g_slist_free(edt->pi.dependent_frames);
/* Free the data sources list. */
free_data_sources(&edt->pi);
@@ -684,7 +683,6 @@ epan_dissect_cleanup(epan_dissect_t* edt)
g_slist_foreach(epan_plugins, epan_plugin_dissect_cleanup, edt);
g_slist_free(edt->pi.proto_data);
- g_slist_free(edt->pi.dependent_frames);
/* Free the data sources list. */
free_data_sources(&edt->pi);
diff --git a/epan/frame_data.c b/epan/frame_data.c
index 75c627db4f..23640abc72 100644
--- a/epan/frame_data.c
+++ b/epan/frame_data.c
@@ -161,6 +161,7 @@ frame_data_init(frame_data *fdata, guint32 num, const wtap_rec *rec,
fdata->subnum = 0;
fdata->passed_dfilter = 0;
fdata->dependent_of_displayed = 0;
+ fdata->dependent_frames = NULL;
fdata->encoding = PACKET_CHAR_ENC_CHAR_ASCII;
fdata->visited = 0;
fdata->marked = 0;
@@ -306,6 +307,11 @@ frame_data_destroy(frame_data *fdata)
g_slist_free(fdata->pfd);
fdata->pfd = NULL;
}
+
+ if (fdata->dependent_frames) {
+ g_slist_free(fdata->dependent_frames);
+ fdata->dependent_frames = NULL;
+ }
}
/*
diff --git a/epan/frame_data.h b/epan/frame_data.h
index b29633416f..55d2fa99c0 100644
--- a/epan/frame_data.h
+++ b/epan/frame_data.h
@@ -77,6 +77,7 @@ typedef struct _frame_data {
are 32 bits. */
unsigned int passed_dfilter : 1; /**< 1 = display, 0 = no display */
unsigned int dependent_of_displayed : 1; /**< 1 if a displayed frame depends on this frame */
+ GSList *dependent_frames; /**< A list of frames which this one depends on */
/* Do NOT use packet_char_enc enum here: MSVC compiler does not handle an enum in a bit field properly */
unsigned int encoding : 1; /**< Character encoding (ASCII, EBCDIC...) */
unsigned int visited : 1; /**< Has this packet been visited yet? 1=Yes,0=No*/
diff --git a/epan/frame_data_sequence.c b/epan/frame_data_sequence.c
index e580a44d60..5ae3703d37 100644
--- a/epan/frame_data_sequence.c
+++ b/epan/frame_data_sequence.c
@@ -321,6 +321,7 @@ find_and_mark_frame_depended_upon(gpointer data, gpointer user_data)
if (dependent_frame && frames) {
dependent_fd = frame_data_sequence_find(frames, dependent_frame);
dependent_fd->dependent_of_displayed = 1;
+ g_slist_foreach(dependent_fd->dependent_frames, find_and_mark_frame_depended_upon, frames);
}
}
diff --git a/epan/packet.c b/epan/packet.c
index c6378a5392..3275f8ed0c 100644
--- a/epan/packet.c
+++ b/epan/packet.c
@@ -445,11 +445,11 @@ free_data_sources(packet_info *pinfo)
}
void
-mark_frame_as_depended_upon(packet_info *pinfo, guint32 frame_num)
+mark_frame_as_depended_upon(frame_data *fd, guint32 frame_num)
{
/* Don't mark a frame as dependent on itself */
- if (frame_num != pinfo->num) {
- pinfo->dependent_frames = g_slist_prepend(pinfo->dependent_frames, GUINT_TO_POINTER(frame_num));
+ if (frame_num != fd->num) {
+ fd->dependent_frames = g_slist_prepend(fd->dependent_frames, GUINT_TO_POINTER(frame_num));
}
}
diff --git a/epan/packet.h b/epan/packet.h
index 1213c482ff..63955ea340 100644
--- a/epan/packet.h
+++ b/epan/packet.h
@@ -772,7 +772,7 @@ extern void free_data_sources(packet_info *pinfo);
* if the user does a File->Save-As of only the Displayed packets and the
* current frame passed the display filter.
*/
-WS_DLL_PUBLIC void mark_frame_as_depended_upon(packet_info *pinfo, guint32 frame_num);
+WS_DLL_PUBLIC void mark_frame_as_depended_upon(frame_data *fd, guint32 frame_num);
/* Structure passed to the frame dissector */
typedef struct frame_data_s
diff --git a/epan/packet_info.h b/epan/packet_info.h
index 0c57bc20c0..63d5521308 100644
--- a/epan/packet_info.h
+++ b/epan/packet_info.h
@@ -149,8 +149,6 @@ typedef struct _packet_info {
GSList* proto_data; /**< Per packet proto data */
- GSList* dependent_frames; /**< A list of frames which this one depends on */
-
GSList* frame_end_routines;
wmem_allocator_t *pool; /**< Memory pool scoped to the pinfo struct */
diff --git a/epan/reassemble.c b/epan/reassemble.c
index 40e9ce5d8b..3fc1bd4bc8 100644
--- a/epan/reassemble.c
+++ b/epan/reassemble.c
@@ -2964,7 +2964,7 @@ show_fragment(fragment_item *fd, const int offset, const fragment_items *fit,
plurality(fd->len, "", "s"));
}
proto_item_set_generated(fei);
- mark_frame_as_depended_upon(pinfo, fd->frame);
+ mark_frame_as_depended_upon(pinfo->fd, fd->frame);
if (fd->flags & (FD_OVERLAP|FD_OVERLAPCONFLICT
|FD_MULTIPLETAILS|FD_TOOLONGFRAGMENT) ) {
/* this fragment has some flags set, create a subtree