aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cfile.c1
-rw-r--r--cfile.h1
-rw-r--r--file.c102
3 files changed, 84 insertions, 20 deletions
diff --git a/cfile.c b/cfile.c
index 0fe615d8cd..8ad55160f7 100644
--- a/cfile.c
+++ b/cfile.c
@@ -51,7 +51,6 @@ init_cap_file(capture_file *cf)
cf->is_tempfile = FALSE;
cf->rfcode = NULL;
cf->dfilter = NULL;
- cf->dfcode = NULL;
cf->has_snap = FALSE;
cf->snap = WTAP_MAX_PACKET_SIZE;
cf->count = 0;
diff --git a/cfile.h b/cfile.h
index 33a9752593..a5b154158d 100644
--- a/cfile.h
+++ b/cfile.h
@@ -61,7 +61,6 @@ typedef struct _capture_file {
wtap *wth; /* Wiretap session */
dfilter_t *rfcode; /* Compiled read (display) filter program */
gchar *dfilter; /* Display filter string */
- dfilter_t *dfcode; /* Compiled display filter program */
/* search */
gchar *sfilter; /* Search filter string */
gboolean sbackward; /* TRUE if search is backward, FALSE if forward */
diff --git a/file.c b/file.c
index 98bb0590b5..987140248f 100644
--- a/file.c
+++ b/file.c
@@ -87,7 +87,7 @@ static guint32 cum_bytes = 0;
static void cf_reset_state(capture_file *cf);
-static int read_packet(capture_file *cf, gint64 offset);
+static int read_packet(capture_file *cf, dfilter_t *dfcode, gint64 offset);
static void rescan_packets(capture_file *cf, const char *action, const char *action_item,
gboolean refilter, gboolean redissect);
@@ -375,6 +375,16 @@ cf_read(capture_file *cf)
gchar status_str[100];
gint64 progbar_nextstep;
gint64 progbar_quantum;
+ dfilter_t *dfcode;
+
+ /* Compile the current display filter.
+ * We assume this will not fail since cf->dfilter is only set in
+ * cf_filter IFF the filter was valid.
+ */
+ dfcode=NULL;
+ if(cf->dfilter){
+ dfilter_compile(cf->dfilter, &dfcode);
+ }
cum_bytes=0;
@@ -462,7 +472,12 @@ cf_read(capture_file *cf)
hours even on fast machines) just to see that it was the wrong file. */
break;
}
- read_packet(cf, data_offset);
+ read_packet(cf, dfcode, data_offset);
+ }
+
+ /* Cleanup and release all dfilter resources */
+ if (dfcode != NULL){
+ dfilter_free(dfcode);
}
/* We're done reading the file; destroy the progress bar if it was created. */
@@ -569,6 +584,16 @@ cf_continue_tail(capture_file *cf, int to_read, int *err)
gint64 data_offset = 0;
gchar *err_info;
int newly_displayed_packets = 0;
+ dfilter_t *dfcode;
+
+ /* Compile the current display filter.
+ * We assume this will not fail since cf->dfilter is only set in
+ * cf_filter IFF the filter was valid.
+ */
+ dfcode=NULL;
+ if(cf->dfilter){
+ dfilter_compile(cf->dfilter, &dfcode);
+ }
*err = 0;
@@ -583,12 +608,17 @@ cf_continue_tail(capture_file *cf, int to_read, int *err)
aren't any packets left to read) exit. */
break;
}
- if (read_packet(cf, data_offset) != -1) {
+ if (read_packet(cf, dfcode, data_offset) != -1) {
newly_displayed_packets++;
}
to_read--;
}
+ /* Cleanup and release all dfilter resources */
+ if (dfcode != NULL){
+ dfilter_free(dfcode);
+ }
+
/*g_log(NULL, G_LOG_LEVEL_MESSAGE, "cf_continue_tail: count %u state: %u err: %u",
cf->count, cf->state, *err);*/
@@ -627,6 +657,16 @@ cf_finish_tail(capture_file *cf, int *err)
{
gchar *err_info;
gint64 data_offset;
+ dfilter_t *dfcode;
+
+ /* Compile the current display filter.
+ * We assume this will not fail since cf->dfilter is only set in
+ * cf_filter IFF the filter was valid.
+ */
+ dfcode=NULL;
+ if(cf->dfilter){
+ dfilter_compile(cf->dfilter, &dfcode);
+ }
if(cf->wth == NULL) {
cf_close(cf);
@@ -642,7 +682,12 @@ cf_finish_tail(capture_file *cf, int *err)
aren't any packets left to read) exit. */
break;
}
- read_packet(cf, data_offset);
+ read_packet(cf, dfcode, data_offset);
+ }
+
+ /* Cleanup and release all dfilter resources */
+ if (dfcode != NULL){
+ dfilter_free(dfcode);
}
packet_list_thaw();
@@ -768,6 +813,7 @@ void cf_set_rfcode(capture_file *cf, dfilter_t *rfcode)
static int
add_packet_to_packet_list(frame_data *fdata, capture_file *cf,
+ dfilter_t *dfcode,
union wtap_pseudo_header *pseudo_header, const guchar *buf,
gboolean refilter)
{
@@ -824,15 +870,15 @@ add_packet_to_packet_list(frame_data *fdata, capture_file *cf,
allocate a protocol tree root node, so that we'll construct
a protocol tree against which a filter expression can be
evaluated. */
- if ((cf->dfcode != NULL && refilter) || color_filters_used()
+ if ((dfcode != NULL && refilter) || color_filters_used()
|| num_tap_filters != 0)
create_proto_tree = TRUE;
/* Dissect the frame. */
edt = epan_dissect_new(create_proto_tree, FALSE);
- if (cf->dfcode != NULL && refilter) {
- epan_dissect_prime_dfilter(edt, cf->dfcode);
+ if (dfcode != NULL && refilter) {
+ epan_dissect_prime_dfilter(edt, dfcode);
}
/* prepare color filters */
if (color_filters_used()) {
@@ -846,9 +892,9 @@ add_packet_to_packet_list(frame_data *fdata, capture_file *cf,
leave the "passed_dfilter" flag alone.
If we don't have a display filter, set "passed_dfilter" to 1. */
- if (cf->dfcode != NULL) {
+ if (dfcode != NULL) {
if (refilter) {
- fdata->flags.passed_dfilter = dfilter_apply_edt(cf->dfcode, edt) ? 1 : 0;
+ fdata->flags.passed_dfilter = dfilter_apply_edt(dfcode, edt) ? 1 : 0;
}
} else
fdata->flags.passed_dfilter = 1;
@@ -916,7 +962,7 @@ add_packet_to_packet_list(frame_data *fdata, capture_file *cf,
/* read in a new packet */
/* returns the row of the new packet in the packet list or -1 if not displayed */
static int
-read_packet(capture_file *cf, gint64 offset)
+read_packet(capture_file *cf, dfilter_t *dfcode, gint64 offset)
{
const struct wtap_pkthdr *phdr = wtap_phdr(cf->wth);
union wtap_pseudo_header *pseudo_header = wtap_pseudoheader(cf->wth);
@@ -966,7 +1012,7 @@ read_packet(capture_file *cf, gint64 offset)
cf->count++;
cf->f_datalen = offset + phdr->caplen;
fdata->num = cf->count;
- row = add_packet_to_packet_list(fdata, cf, pseudo_header, buf, TRUE);
+ row = add_packet_to_packet_list(fdata, cf, dfcode, pseudo_header, buf, TRUE);
} else {
/* XXX - if we didn't have read filters, or if we could avoid
allocating the "frame_data" structure until we knew whether
@@ -1212,18 +1258,21 @@ cf_merge_files(char **out_filenamep, int in_file_count,
cf_status_t
cf_filter_packets(capture_file *cf, gchar *dftext, gboolean force)
{
- dfilter_t *dfcode;
const char *filter_new = dftext ? dftext : "";
const char *filter_old = cf->dfilter ? cf->dfilter : "";
+ dfilter_t *dfcode;
/* if new filter equals old one, do nothing unless told to do so */
if (!force && strcmp(filter_new, filter_old) == 0) {
return CF_OK;
}
+ dfcode=NULL;
+
if (dftext == NULL) {
- /* The new filter is an empty filter (i.e., display all packets). */
- dfcode = NULL;
+ /* The new filter is an empty filter (i.e., display all packets).
+ * so leave dfcode==NULL
+ */
} else {
/*
* We have a filter; make a copy of it (as we'll be saving it),
@@ -1260,9 +1309,6 @@ cf_filter_packets(capture_file *cf, gchar *dftext, gboolean force)
if (cf->dfilter != NULL)
g_free(cf->dfilter);
cf->dfilter = dftext;
- if (cf->dfcode != NULL)
- dfilter_free(cf->dfcode);
- cf->dfcode = dfcode;
/* Now rescan the packet list, applying the new filter, but not
throwing away information constructed on a previous pass. */
@@ -1271,6 +1317,11 @@ cf_filter_packets(capture_file *cf, gchar *dftext, gboolean force)
} else {
rescan_packets(cf, "Filtering", dftext, TRUE, FALSE);
}
+
+ /* Cleanup and release all dfilter resources */
+ if (dfcode != NULL){
+ dfilter_free(dfcode);
+ }
return CF_OK;
}
@@ -1325,6 +1376,16 @@ rescan_packets(capture_file *cf, const char *action, const char *action_item,
gchar status_str[100];
int progbar_nextstep;
int progbar_quantum;
+ dfilter_t *dfcode;
+
+ /* Compile the current display filter.
+ * We assume this will not fail since cf->dfilter is only set in
+ * cf_filter IFF the filter was valid.
+ */
+ dfcode=NULL;
+ if(cf->dfilter){
+ dfilter_compile(cf->dfilter, &dfcode);
+ }
cum_bytes=0;
reset_tap_listeners();
@@ -1468,7 +1529,7 @@ rescan_packets(capture_file *cf, const char *action, const char *action_item,
preceding_row = prev_row;
preceding_frame = prev_frame;
}
- row = add_packet_to_packet_list(fdata, cf, &cf->pseudo_header, cf->pd,
+ row = add_packet_to_packet_list(fdata, cf, dfcode, &cf->pseudo_header, cf->pd,
refilter);
/* If this frame is displayed, and this is the first frame we've
@@ -1555,6 +1616,11 @@ rescan_packets(capture_file *cf, const char *action, const char *action_item,
it the focus row, and make it visible. */
packet_list_set_selected_row(selected_row);
}
+
+ /* Cleanup and release all dfilter resources */
+ if (dfcode != NULL){
+ dfilter_free(dfcode);
+ }
}
typedef enum {