Workaround for firefox hanging on blocked javascript pages
[privoxy.git] / actions.c
index 4257acc..d88d9e3 100644 (file)
--- a/actions.c
+++ b/actions.c
@@ -1,4 +1,4 @@
-const char actions_rcs[] = "$Id: actions.c,v 1.45 2008/03/24 11:21:02 fabiankeil Exp $";
+const char actions_rcs[] = "$Id: actions.c,v 1.57 2009/04/04 18:13:51 fabiankeil Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/actions.c,v $
@@ -31,222 +31,8 @@ const char actions_rcs[] = "$Id: actions.c,v 1.45 2008/03/24 11:21:02 fabiankeil
  *                or write to the Free Software Foundation, Inc., 59
  *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
- * Revisions   :
- *    $Log: actions.c,v $
- *    Revision 1.45  2008/03/24 11:21:02  fabiankeil
- *    Share the action settings for multiple patterns in the same
- *    section so we waste less memory for gigantic block lists
- *    (and load them slightly faster). Reported by Franz Schwartau.
- *
- *    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.
- *
- *    Revision 1.42  2008/02/09 15:15:38  fabiankeil
- *    List active and inactive actions in the show-url-info's
- *    "Final results" section separately. Patch submitted by Lee
- *    in #1830056, modified to list active actions first.
- *
- *    Revision 1.41  2008/01/28 20:17:40  fabiankeil
- *    - Mark some parameters as immutable.
- *    - Hide update_action_bits_for_all_tags() while it's unused.
- *
- *    Revision 1.40  2007/05/21 10:26:50  fabiankeil
- *    - Use strlcpy() instead of strcpy().
- *    - Provide a reason why loading the actions
- *      file might have failed.
- *
- *    Revision 1.39  2007/04/17 18:21:45  fabiankeil
- *    Split update_action_bits() into
- *    update_action_bits_for_all_tags()
- *    and update_action_bits_for_tag().
- *
- *    Revision 1.38  2007/04/15 16:39:20  fabiankeil
- *    Introduce tags as alternative way to specify which
- *    actions apply to a request. At the moment tags can be
- *    created based on client and server headers.
- *
- *    Revision 1.37  2007/03/11 15:56:12  fabiankeil
- *    Add kludge to log unknown aliases and actions before exiting.
- *
- *    Revision 1.36  2006/12/28 17:15:42  fabiankeil
- *    Fix gcc43 conversion warning.
- *
- *    Revision 1.35  2006/07/18 14:48:45  david__schmidt
- *    Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch)
- *    with what was really the latest development (the v_3_0_branch branch)
- *
- *    Revision 1.32.2.6  2006/01/29 23:10:56  david__schmidt
- *    Multiple filter file support
- *
- *    Revision 1.32.2.5  2005/06/09 01:18:41  david__schmidt
- *    Tweaks to conditionally include pthread.h if FEATURE_PTHREAD is enabled -
- *    this becomes important when jcc.h gets included later down the line.
- *
- *    Revision 1.32.2.4  2003/12/03 10:33:11  oes
- *    - Implemented Privoxy version requirement through
- *      for-privoxy-version= statement in {{settings}}
- *      block
- *    - Fix for unchecked out-of-memory condition
- *
- *    Revision 1.32.2.3  2003/02/28 12:52:10  oes
- *    Fixed memory leak reported by Dan Price in Bug #694713
- *
- *    Revision 1.32.2.2  2002/11/20 14:36:55  oes
- *    Extended unload_current_actions_file() to multiple AFs.
- *    Thanks to Oliver Stoeneberg for the hint.
- *
- *    Revision 1.32.2.1  2002/05/26 12:13:16  roro
- *    Change unsigned to unsigned long in actions_name struct.  This closes
- *    SourceForge Bug #539284.
- *
- *    Revision 1.32  2002/05/12 21:36:29  jongfoster
- *    Correcting function comments
- *
- *    Revision 1.31  2002/05/06 07:56:50  oes
- *    Made actions_to_html independent of FEATURE_CGI_EDIT_ACTIONS
- *
- *    Revision 1.30  2002/04/30 11:14:52  oes
- *    Made csp the first parameter in *action_to_html
- *
- *    Revision 1.29  2002/04/26 19:30:54  jongfoster
- *    - current_action_to_html(): Adding help link for the "-" form of
- *      one-string actions.
- *    - Some actions had "<br>-", some "<br> -" (note the space).
- *      Standardizing on no space.
- *    - Greatly simplifying some of the code by using string_join()
- *      where appropriate.
- *
- *    Revision 1.28  2002/04/26 12:53:15  oes
- *     - CGI AF editor now writes action lines split into
- *       single lines with line continuation
- *     - actions_to_html now embeds each action name in
- *       link to chapter
- *     - current_action_to_text is now called current_action_to_html
- *       and acts like actions_to_html
- *
- *    Revision 1.27  2002/04/24 02:10:31  oes
- *     - Jon's patch for multiple AFs:
- *       - split load_actions_file, add load_one_actions_file
- *       - make csp->actions_list files an array
- *       - remember file id with each action
- *     - Copy_action now frees dest action before copying
- *
- *    Revision 1.26  2002/03/26 22:29:54  swa
- *    we have a new homepage!
- *
- *    Revision 1.25  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.24  2002/03/16 23:54:06  jongfoster
- *    Adding graceful termination feature, to help look for memory leaks.
- *    If you enable this (which, by design, has to be done by hand
- *    editing config.h) and then go to http://i.j.b/die, then the program
- *    will exit cleanly after the *next* request.  It should free all the
- *    memory that was used.
- *
- *    Revision 1.23  2002/03/07 03:46:16  oes
- *    Fixed compiler warnings
- *
- *    Revision 1.22  2002/01/21 00:27:02  jongfoster
- *    Allowing free_action(NULL).
- *    Moving the functions that #include actionlist.h to the end of the file,
- *    because the Visual C++ 97 debugger gets extremely confused if you try
- *    to debug any code that comes after them in the file.
- *
- *    Revision 1.21  2002/01/17 20:54:44  jongfoster
- *    Renaming free_url to free_url_spec, since it frees a struct url_spec.
- *
- *    Revision 1.20  2001/11/22 21:56:49  jongfoster
- *    Making action_spec->flags into an unsigned long rather than just an
- *    unsigned int.
- *    Fixing a bug in the display of -add-header and -wafer
- *
- *    Revision 1.19  2001/11/13 00:14:07  jongfoster
- *    Fixing stupid bug now I've figured out what || means.
- *    (It always returns 0 or 1, not one of it's paramaters.)
- *
- *    Revision 1.18  2001/11/07 00:06:06  steudten
- *    Add line number in error output for lineparsing for
- *    actionsfile.
- *
- *    Revision 1.17  2001/10/25 03:40:47  david__schmidt
- *    Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
- *    threads to call select() simultaneously.  So, it's time to do a real, live,
- *    native OS/2 port.  See defines for __EMX__ (the porting layer) vs. __OS2__
- *    (native). Both versions will work, but using __OS2__ offers multi-threading.
- *
- *    Revision 1.16  2001/10/23 21:30:30  jongfoster
- *    Adding error-checking to selected functions.
- *
- *    Revision 1.15  2001/10/14 21:58:22  jongfoster
- *    Adding support for the CGI-based editor:
- *    - Exported get_actions()
- *    - Added new function free_alias_list()
- *    - Added support for {{settings}} and {{description}} blocks
- *      in the actions file.  They are currently ignored.
- *    - Added restriction to only one {{alias}} block which must appear
- *      first in the file, to simplify the editor's rewriting rules.
- *    - Note that load_actions_file() is no longer used by the CGI-based
- *      editor, but some of the other routines in this file are.
- *
- *    Revision 1.14  2001/09/22 16:36:59  jongfoster
- *    Removing unused parameter fs from read_config_line()
- *
- *    Revision 1.13  2001/09/16 15:47:37  jongfoster
- *    First version of CGI-based edit interface.  This is very much a
- *    work-in-progress, and you can't actually use it to edit anything
- *    yet.  You must #define FEATURE_CGI_EDIT_ACTIONS for these changes
- *    to have any effect.
- *
- *    Revision 1.12  2001/09/16 13:21:27  jongfoster
- *    Changes to use new list functions.
- *
- *    Revision 1.11  2001/09/14 00:17:32  jongfoster
- *    Tidying up memory allocation. New function init_action().
- *
- *    Revision 1.10  2001/09/10 10:14:34  oes
- *    Removing unused variable
- *
- *    Revision 1.9  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.8  2001/06/29 13:19:52  oes
- *    Removed logentry from cancelled commit
- *
- *    Revision 1.7  2001/06/09 10:55:28  jongfoster
- *    Changing BUFSIZ ==> BUFFER_SIZE
- *
- *    Revision 1.6  2001/06/07 23:04:34  jongfoster
- *    Made get_actions() static.
- *
- *    Revision 1.5  2001/06/03 19:11:48  oes
- *    adapted to new enlist_unique arg format
- *
- *    Revision 1.4  2001/06/01 20:03:42  jongfoster
- *    Better memory management - current_action->strings[] now
- *    contains copies of the strings, not the original.
- *
- *    Revision 1.3  2001/06/01 18:49:17  jongfoster
- *    Replaced "list_share" with "list" - the tiny memory gain was not
- *    worth the extra complexity.
- *
- *    Revision 1.2  2001/05/31 21:40:00  jongfoster
- *    Removing some commented out, obsolete blocks of code.
- *
- *    Revision 1.1  2001/05/31 21:16:46  jongfoster
- *    Moved functions to process the action list into this new file.
- *
- *
  *********************************************************************/
-\f
+
 
 #include "config.h"
 
@@ -635,7 +421,7 @@ jb_err get_action_token(char **line, char **name, char **value)
 
 /*********************************************************************
  *
- * Function    :  action_used_to_valid_
+ * Function    :  action_used_to_be_valid
  *
  * Description :  Checks if unrecognized actions were valid in earlier
  *                releases.
@@ -648,8 +434,26 @@ jb_err get_action_token(char **line, char **name, char **value)
  *********************************************************************/
 static int action_used_to_be_valid(const char *action)
 {
-   return (0 == strcmpic(action, "treat-forbidden-connects-like-blocks")
-        || 0 == strcmpic(action, "kill-popups"));
+   static const char *formerly_valid_actions[] = {
+      "inspect-jpegs",
+      "kill-popups",
+      "send-vanilla-wafer",
+      "send-wafer",
+      "treat-forbidden-connects-like-blocks",
+      "vanilla-wafer",
+      "wafer"
+   };
+   unsigned int i;
+
+   for (i = 0; i < SZ(formerly_valid_actions); i++)
+   {
+      if (0 == strcmpic(action, formerly_valid_actions[i]))
+      {
+         return TRUE;
+      }
+   }
+
+   return FALSE;
 }
 
 /*********************************************************************
@@ -722,16 +526,12 @@ jb_err get_actions(char *line,
                      {
                         /*
                          * XXX: Temporary backwards compatibility hack.
+                         * XXX: should include line number.
                          */
-                        static int complaint_shown = 0;
                         value = "No reason specified.";
-                        if (!complaint_shown)
-                        {
-                           log_error(LOG_LEVEL_ERROR, "At least one block "
-                              "without reason found. This may become a fatal "
-                              "error in future versions.");
-                           complaint_shown = 1;
-                        }
+                        log_error(LOG_LEVEL_ERROR,
+                           "block action without reason found. This may "
+                           "become a fatal error in future versions.");
                      }
                      else
                      {
@@ -830,11 +630,17 @@ jb_err get_actions(char *line,
                /* Found it */
                merge_actions(cur_action, alias->action);
             }
-            else if ((2 < strlen(option)) && action_used_to_be_valid(option+1))
+            else if (((size_t)2 < strlen(option)) && action_used_to_be_valid(option+1))
             {
                log_error(LOG_LEVEL_ERROR, "Action '%s' is no longer valid "
                   "in this Privoxy release. Ignored.", option+1);
             }
+            else if (((size_t)2 < strlen(option)) && 0 == strcmpic(option+1, "hide-forwarded-for-headers"))
+            {
+               log_error(LOG_LEVEL_FATAL, "The action 'hide-forwarded-for-headers' "
+                  "is no longer valid in this Privoxy release. "
+                  "Use 'change-x-forwarded-for' instead.");
+            }
             else
             {
                /* Bad action name */
@@ -1048,7 +854,7 @@ int update_action_bits_for_tag(struct client_state *csp, const char *tag)
             if (merge_current_action(csp->action, b->action))
             {
                log_error(LOG_LEVEL_ERROR,
-                  "Out of memorey while changing action bits");
+                  "Out of memory while changing action bits");
             }
             /* and signal the change. */
             updated = 1;
@@ -1073,7 +879,7 @@ int update_action_bits_for_tag(struct client_state *csp, const char *tag)
  * Returns     :  N/A
  *
  *********************************************************************/
-void free_current_action (struct current_action_spec *src)
+void free_current_action(struct current_action_spec *src)
 {
    int i;
 
@@ -1191,7 +997,7 @@ void free_alias_list(struct action_alias *alias_list)
 
 /*********************************************************************
  *
- * Function    :  load_actions_file
+ * Function    :  load_action_files
  *
  * Description :  Read and parse all the action files and add to files
  *                list.
@@ -1202,7 +1008,7 @@ void free_alias_list(struct action_alias *alias_list)
  * Returns     :  0 => Ok, everything else is an error.
  *
  *********************************************************************/
-int load_actions_file(struct client_state *csp)
+int load_action_files(struct client_state *csp)
 {
    int i;
    int result;
@@ -1307,7 +1113,7 @@ static int load_one_actions_file(struct client_state *csp, int fileid)
             size_t len = strlen(buf);
             char * start = buf + 2;
             char * end = buf + len - 1;
-            if ((len < 5) || (*end-- != '}') || (*end-- != '}'))
+            if ((len < (size_t)5) || (*end-- != '}') || (*end-- != '}'))
             {
                /* too short */
                fclose(fp);
@@ -1692,9 +1498,9 @@ static int load_one_actions_file(struct client_state *csp, int fileid)
  *********************************************************************/
 char * actions_to_text(const struct action_spec *action)
 {
-   unsigned mask = action->mask;
-   unsigned add  = action->add;
-   char * result = strdup("");
+   unsigned long mask = action->mask;
+   unsigned long add  = action->add;
+   char *result = strdup("");
    struct list_entry * lst;
 
    /* sanity - prevents "-feature +feature" */
@@ -1781,9 +1587,9 @@ char * actions_to_text(const struct action_spec *action)
 char * actions_to_html(const struct client_state *csp,
                        const struct action_spec *action)
 {
-   unsigned mask = action->mask;
-   unsigned add  = action->add;
-   char * result = strdup("");
+   unsigned long mask = action->mask;
+   unsigned long add  = action->add;
+   char *result = strdup("");
    struct list_entry * lst;
 
    /* sanity - prevents "-feature +feature" */