X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=actions.c;h=d19308278f205ef834f3da2d2fc40dfab65a55a4;hp=d7212c6ddc690e83415489691cafa4135061c14b;hb=7726b37a51a3b1e0725c6c7e7b549569a0b30f26;hpb=994e35d0510a22346d510eee39829f91a2f13387
diff --git a/actions.c b/actions.c
index d7212c6d..d1930827 100644
--- a/actions.c
+++ b/actions.c
@@ -1,4 +1,4 @@
-const char actions_rcs[] = "$Id: actions.c,v 1.58 2009/05/16 13:27:20 fabiankeil Exp $";
+const char actions_rcs[] = "$Id: actions.c,v 1.67 2011/03/08 18:30:46 fabiankeil Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/actions.c,v $
@@ -6,7 +6,7 @@ const char actions_rcs[] = "$Id: actions.c,v 1.58 2009/05/16 13:27:20 fabiankeil
* Purpose : Declares functions to work with actions files
* Functions declared include: FIXME
*
- * Copyright : Written by and Copyright (C) 2001-2008 the SourceForge
+ * Copyright : Written by and Copyright (C) 2001-2011 the
* Privoxy team. http://www.privoxy.org/
*
* Based on the Internet Junkbuster originally written
@@ -522,7 +522,7 @@ jb_err get_actions(char *line,
if ((value == NULL) || (*value == '\0'))
{
- if (0 != strcmpic(action->name, "block"))
+ if (0 == strcmpic(action->name, "+block"))
{
/*
* XXX: Temporary backwards compatibility hack.
@@ -1055,23 +1055,24 @@ static int load_one_actions_file(struct client_state *csp, int fileid)
* Note: Keep these in the order they occur in the file, they are
* sometimes tested with <=
*/
-#define MODE_START_OF_FILE 1
-#define MODE_SETTINGS 2
-#define MODE_DESCRIPTION 3
-#define MODE_ALIAS 4
-#define MODE_ACTIONS 5
-
- int mode = MODE_START_OF_FILE;
+ enum {
+ MODE_START_OF_FILE = 1,
+ MODE_SETTINGS = 2,
+ MODE_DESCRIPTION = 3,
+ MODE_ALIAS = 4,
+ MODE_ACTIONS = 5
+ } mode;
FILE *fp;
struct url_actions *last_perm;
struct url_actions *perm;
- char buf[BUFFER_SIZE];
+ char *buf;
struct file_list *fs;
struct action_spec * cur_action = NULL;
int cur_action_used = 0;
struct action_alias * alias_list = NULL;
unsigned long linenum = 0;
+ mode = MODE_START_OF_FILE;
if (!check_file_changed(current_actions_file[fileid], csp->config->actions_file[fileid], &fs))
{
@@ -1104,7 +1105,7 @@ static int load_one_actions_file(struct client_state *csp, int fileid)
log_error(LOG_LEVEL_INFO, "Loading actions file: %s", csp->config->actions_file[fileid]);
- while (read_config_line(buf, sizeof(buf), fp, &linenum) != NULL)
+ while (read_config_line(fp, &linenum, &buf) != NULL)
{
if (*buf == '{')
{
@@ -1221,11 +1222,11 @@ 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 */
- mode = MODE_ACTIONS;
+ mode = MODE_ACTIONS;
/* free old action */
if (cur_action)
@@ -1248,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;
@@ -1257,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 */
}
@@ -1271,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)
@@ -1409,7 +1428,7 @@ static int load_one_actions_file(struct client_state *csp, int fileid)
}
else if (mode == MODE_ACTIONS)
{
- /* it's a URL pattern */
+ /* it's an URL pattern */
/* allocate a new node */
if ((perm = zalloc(sizeof(*perm))) == NULL)
@@ -1429,7 +1448,7 @@ static int load_one_actions_file(struct client_state *csp, int fileid)
{
fclose(fp);
log_error(LOG_LEVEL_FATAL,
- "can't load actions file '%s': line %lu: cannot create URL pattern from: %s",
+ "can't load actions file '%s': line %lu: cannot create URL or TAG pattern from: %s",
csp->config->actions_file[fileid], linenum, buf);
return 1; /* never get here */
}
@@ -1456,6 +1475,7 @@ static int load_one_actions_file(struct client_state *csp, int fileid)
csp->config->actions_file[fileid], mode);
return 1; /* never get here */
}
+ freez(buf);
}
fclose(fp);
@@ -1574,7 +1594,7 @@ char * actions_to_text(const struct action_spec *action)
* Function : actions_to_html
*
* Description : Converts a actionsfile entry from numeric form
- * ("mask" and "add") to a
-seperated HTML string
+ * ("mask" and "add") to a
-separated HTML string
* in which each action is linked to its chapter in
* the user manual.
*
@@ -1680,7 +1700,7 @@ char * actions_to_html(const struct client_state *csp,
*
* Function : current_actions_to_html
*
- * Description : Converts a curren action spec to a
seperated HTML
+ * Description : Converts a curren action spec to a
separated HTML
* text in which each action is linked to its chapter in
* the user manual.
*