Share the action settings for multiple patterns in the same
authorFabian Keil <fk@fabiankeil.de>
Mon, 24 Mar 2008 11:21:03 +0000 (11:21 +0000)
committerFabian Keil <fk@fabiankeil.de>
Mon, 24 Mar 2008 11:21:03 +0000 (11:21 +0000)
section so we waste less memory for gigantic block lists
(and load them slightly faster). Reported by Franz Schwartau.

ChangeLog
actions.c
project.h

index 7983cdf..bf60300 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -20,6 +20,9 @@ ChangeLog for Privoxy
   file modification timestamps. This makes life harder for attackers
   who can leverage browser bugs to send fake Referers and intend to
   brute-force edit URLs.
+- Action settings for multiple patterns in the same section are
+  shared in memory. As a result these sections take up less space
+  (and are loaded slightly faster). Problem reported by Franz Schwartau.
 - Host information is gathered outside the main thread so it's less
   likely to delay other incoming connections if the host is misconfigured.
 - The CGI editor supports the "disable all filters of this type"
index 2fb546f..b4904c9 100644 (file)
--- a/actions.c
+++ b/actions.c
@@ -1,4 +1,4 @@
-const char actions_rcs[] = "$Id: actions.c,v 1.43 2008/03/01 14:00:43 fabiankeil Exp $";
+const char actions_rcs[] = "$Id: actions.c,v 1.44 2008/03/04 18:30:34 fabiankeil Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/actions.c,v $
@@ -33,6 +33,10 @@ const char actions_rcs[] = "$Id: actions.c,v 1.43 2008/03/01 14:00:43 fabiankeil
  *
  * Revisions   :
  *    $Log: actions.c,v $
+ *    Revision 1.44  2008/03/04 18:30:34  fabiankeil
+ *    Remove the treat-forbidden-connects-like-blocks action. We now
+ *    use the "blocked" page for forbidden CONNECT requests by default.
+ *
  *    Revision 1.43  2008/03/01 14:00:43  fabiankeil
  *    Let the block action take the reason for the block
  *    as argument and show it on the "blocked" page.
@@ -462,6 +466,24 @@ jb_err copy_action (struct action_spec *dest,
    return err;
 }
 
+/*********************************************************************
+ *
+ * Function    :  free_action_spec
+ *
+ * Description :  Frees an action_spec and the memory used by it.
+ *
+ * Parameters  :
+ *          1  :  src = Source to free.
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+void free_action_spec(struct action_spec *src)
+{
+   free_action(src);
+   freez(src);
+}
+
 
 /*********************************************************************
  *
@@ -1119,11 +1141,19 @@ void unload_actions_file(void *file_data)
    {
       next = cur->next;
       free_url_spec(cur->url);
-      free_action(cur->action);
+      if ((next == NULL) || (next->action != cur->action))
+      {
+         /*
+          * As the action settings might be shared,
+          * we can only free them if the current
+          * url pattern is the last one, or if the
+          * next one is using different settings.
+          */
+         free_action_spec(cur->action);
+      }
       freez(cur);
       cur = next;
    }
-
 }
 
 
@@ -1388,8 +1418,7 @@ static int load_one_actions_file(struct client_state *csp, int fileid)
             {
                if (!cur_action_used)
                {
-                  free_action(cur_action);
-                  free(cur_action);
+                  free_action_spec(cur_action);
                }
                cur_action = NULL;
             }
@@ -1578,8 +1607,8 @@ static int load_one_actions_file(struct client_state *csp, int fileid)
             return 1; /* never get here */
          }
 
-         /* Save flags */
-         copy_action (perm->action, cur_action);
+         perm->action = cur_action;
+         cur_action_used = 1;
 
          /* Save the URL pattern */
          if (create_url_spec(perm->url, buf))
@@ -1617,9 +1646,10 @@ static int load_one_actions_file(struct client_state *csp, int fileid)
 
    fclose(fp);
 
-   free_action(cur_action);
-   freez(cur_action);
-
+   if (!cur_action_used)
+   {
+      free_action_spec(cur_action);
+   }
    free_alias_list(alias_list);
 
    /* the old one is now obsolete */
index 70260eb..05fa8e6 100644 (file)
--- a/project.h
+++ b/project.h
@@ -1,7 +1,7 @@
 #ifndef PROJECT_H_INCLUDED
 #define PROJECT_H_INCLUDED
 /** Version string. */
-#define PROJECT_H_VERSION "$Id: project.h,v 1.104 2008/03/04 18:30:40 fabiankeil Exp $"
+#define PROJECT_H_VERSION "$Id: project.h,v 1.105 2008/03/21 11:16:27 fabiankeil Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/project.h,v $
@@ -37,6 +37,9 @@
  *
  * Revisions   :
  *    $Log: project.h,v $
+ *    Revision 1.105  2008/03/21 11:16:27  fabiankeil
+ *    Garbage-collect csp->my_ip_addr_str and csp->my_hostname.
+ *
  *    Revision 1.104  2008/03/04 18:30:40  fabiankeil
  *    Remove the treat-forbidden-connects-like-blocks action. We now
  *    use the "blocked" page for forbidden CONNECT requests by default.
@@ -1179,18 +1182,22 @@ struct action_spec
 
 
 /**
- * This structure is used to store the actions list.
+ * This structure is used to store action files.
  *
- * It contains a URL pattern, and the chages to the actions.
- * It is a linked list.
+ * It contains an URL or tag pattern, and the changes to
+ * the actions. It's a linked list and should only be
+ * free'd through unload_actions_file() unless there's
+ * only a single entry.
  */
 struct url_actions
 {
-   struct url_spec url[1];        /**< URL pattern. */
+   struct url_spec url[1];     /**< The URL or tag pattern. */
 
-   struct action_spec action[1];  /**< Actions. */
+   struct action_spec *action; /**< Action settings that might be shared with
+                                    the list entry before or after the current
+                                    one and can't be free'd willy nilly. */
 
-   struct url_actions * next;     /**< Next action in file, or NULL. */
+   struct url_actions *next;   /**< Next action section in file, or NULL. */
 };