break out dfcode from the capture file structure and declare it locally where it...
authorRonnie Sahlberg <ronnie_sahlberg@ozemail.com.au>
Mon, 1 Jan 2007 10:23:37 +0000 (10:23 -0000)
committerRonnie Sahlberg <ronnie_sahlberg@ozemail.com.au>
Mon, 1 Jan 2007 10:23:37 +0000 (10:23 -0000)
allocate and release the dfcode program as needed instead of having it hang around in the capture file structure.

this will ensure that dfcode will not have longer than se scope lifetime in case we need that property of it later

svn path=/trunk/; revision=20251

cfile.c
cfile.h
file.c

diff --git a/cfile.c b/cfile.c
index 0fe615d8cd974e50bb51bcacb44644500524316f..8ad55160f7887a3e817002e2a8df45a5e2e997f7 100644 (file)
--- 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 33a9752593b78ad9b2cb9bb248b1d2769111bb61..a5b154158db40f8f577f5d6e1458821497e038c7 100644 (file)
--- 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 98bb0590b5e4b35c159d75b71b2adf46959e7bd0..987140248f5e053d16567119ae2ad0f13ab68545 100644 (file)
--- 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 {