In compile_dynamic_pcrs_job_list(), also log the actual error code as pcrs_strerror...
[privoxy.git] / actions.c
index 5b32114..833e711 100644 (file)
--- a/actions.c
+++ b/actions.c
@@ -1,4 +1,4 @@
-const char actions_rcs[] = "$Id: actions.c,v 1.62 2011/02/14 16:01:20 fabiankeil Exp $";
+const char actions_rcs[] = "$Id: actions.c,v 1.65 2011/03/03 14:39:34 fabiankeil Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/actions.c,v $
@@ -1222,7 +1222,7 @@ static int load_one_actions_file(struct client_state *csp, int fileid)
          {
             /* It's an actions block */
 
-            char  actions_buf[BUFFER_SIZE];
+            char *actions_buf;
             char * end;
 
             /* set mode */
@@ -1249,8 +1249,23 @@ static int load_one_actions_file(struct client_state *csp, int fileid)
             }
             init_action(cur_action);
 
-            /* trim { */
-            strlcpy(actions_buf, buf + 1, sizeof(actions_buf));
+            /*
+             * Copy the buffer before messing with it as we may need the
+             * unmodified version in for the fatal error messages. Given
+             * that this is not a common event, we could instead simply
+             * read the line again.
+             *
+             * buf + 1 to skip the leading '{'
+             */
+            actions_buf = strdup(buf + 1);
+            if (actions_buf == NULL)
+            {
+               fclose(fp);
+               log_error(LOG_LEVEL_FATAL,
+                  "can't load actions file '%s': out of memory",
+                  csp->config->actions_file[fileid]);
+               return 1; /* never get here */
+            }
 
             /* check we have a trailing } and then trim it */
             end = actions_buf + strlen(actions_buf) - 1;
@@ -1258,8 +1273,9 @@ static int load_one_actions_file(struct client_state *csp, int fileid)
             {
                /* No closing } */
                fclose(fp);
-               log_error(LOG_LEVEL_FATAL,
-                  "can't load actions file '%s': invalid line (%lu): %s",
+               freez(actions_buf);
+               log_error(LOG_LEVEL_FATAL, "can't load actions file '%s': "
+                  "Missing trailing '}' in action section starting at line (%lu): %s",
                   csp->config->actions_file[fileid], linenum, buf);
                return 1; /* never get here */
             }
@@ -1272,11 +1288,13 @@ static int load_one_actions_file(struct client_state *csp, int fileid)
             {
                /* error */
                fclose(fp);
-               log_error(LOG_LEVEL_FATAL,
-                  "can't load actions file '%s': invalid line (%lu): %s",
+               freez(actions_buf);
+               log_error(LOG_LEVEL_FATAL, "can't load actions file '%s': "
+                  "can't completely parse the action section starting at line (%lu): %s",
                   csp->config->actions_file[fileid], linenum, buf);
                return 1; /* never get here */
             }
+            freez(actions_buf);
          }
       }
       else if (mode == MODE_SETTINGS)