projects
/
privoxy.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Block a bunch of criteo domains
[privoxy.git]
/
filters.c
diff --git
a/filters.c
b/filters.c
index
4231d2d
..
4b4f33e
100644
(file)
--- a/
filters.c
+++ b/
filters.c
@@
-1,4
+1,4
@@
-const char filters_rcs[] = "$Id: filters.c,v 1.1
86 2014/06/12 13:09:03
fabiankeil Exp $";
+const char filters_rcs[] = "$Id: filters.c,v 1.1
95 2015/12/27 12:46:34
fabiankeil Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/filters.c,v $
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/filters.c,v $
@@
-347,12
+347,7
@@
int acl_addr(const char *aspec, struct access_control_addr *aca)
* Use a temporary acl spec copy so we can log
* the unmodified original in case of parse errors.
*/
* Use a temporary acl spec copy so we can log
* the unmodified original in case of parse errors.
*/
- acl_spec = strdup(aspec);
- if (acl_spec == NULL)
- {
- /* XXX: This will be logged as parse error. */
- return(-1);
- }
+ acl_spec = strdup_or_die(aspec);
if ((p = strchr(acl_spec, '/')) != NULL)
{
if ((p = strchr(acl_spec, '/')) != NULL)
{
@@
-391,13
+386,19
@@
int acl_addr(const char *aspec, struct access_control_addr *aca)
{
p = strchr(acl_spec, ':');
}
{
p = strchr(acl_spec, ':');
}
+ if (p != NULL)
+ {
+ assert(*p == ':');
+ *p = '\0';
+ p++;
+ }
#ifdef HAVE_RFC2553
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
#ifdef HAVE_RFC2553
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
- i = getaddrinfo(acl_spec,
((p) ? ++p : NULL)
, &hints, &result);
+ i = getaddrinfo(acl_spec,
p
, &hints, &result);
if (i != 0)
{
if (i != 0)
{
@@
-416,7
+417,6
@@
int acl_addr(const char *aspec, struct access_control_addr *aca)
{
char *endptr;
{
char *endptr;
- *p++ = '\0';
port = strtol(p, &endptr, 10);
if (port <= 0 || port > 65535 || *endptr != '\0')
port = strtol(p, &endptr, 10);
if (port <= 0 || port > 65535 || *endptr != '\0')
@@
-582,12
+582,7
@@
struct http_response *block_url(struct client_state *csp)
/* and handle accordingly: */
if ((p == NULL) || (0 == strcmpic(p, "pattern")))
{
/* and handle accordingly: */
if ((p == NULL) || (0 == strcmpic(p, "pattern")))
{
- rsp->status = strdup("403 Request blocked by Privoxy");
- if (rsp->status == NULL)
- {
- free_http_response(rsp);
- return cgi_error_memory();
- }
+ rsp->status = strdup_or_die("403 Request blocked by Privoxy");
rsp->body = bindup(image_pattern_data, image_pattern_length);
if (rsp->body == NULL)
{
rsp->body = bindup(image_pattern_data, image_pattern_length);
if (rsp->body == NULL)
{
@@
-604,12
+599,7
@@
struct http_response *block_url(struct client_state *csp)
}
else if (0 == strcmpic(p, "blank"))
{
}
else if (0 == strcmpic(p, "blank"))
{
- rsp->status = strdup("403 Request blocked by Privoxy");
- if (rsp->status == NULL)
- {
- free_http_response(rsp);
- return cgi_error_memory();
- }
+ rsp->status = strdup_or_die("403 Request blocked by Privoxy");
rsp->body = bindup(image_blank_data, image_blank_length);
if (rsp->body == NULL)
{
rsp->body = bindup(image_blank_data, image_blank_length);
if (rsp->body == NULL)
{
@@
-626,12
+616,7
@@
struct http_response *block_url(struct client_state *csp)
}
else
{
}
else
{
- rsp->status = strdup("302 Local Redirect from Privoxy");
- if (rsp->status == NULL)
- {
- free_http_response(rsp);
- return cgi_error_memory();
- }
+ rsp->status = strdup_or_die("302 Local Redirect from Privoxy");
if (enlist_unique_header(rsp->headers, "Location", p))
{
if (enlist_unique_header(rsp->headers, "Location", p))
{
@@
-651,7
+636,7
@@
struct http_response *block_url(struct client_state *csp)
new_content_type = csp->action->string[ACTION_STRING_CONTENT_TYPE];
freez(rsp->body);
new_content_type = csp->action->string[ACTION_STRING_CONTENT_TYPE];
freez(rsp->body);
- rsp->body = strdup(" ");
+ rsp->body = strdup
_or_die
(" ");
rsp->content_length = 1;
if (csp->config->feature_flags & RUNTIME_FEATURE_EMPTY_DOC_RETURNS_OK)
rsp->content_length = 1;
if (csp->config->feature_flags & RUNTIME_FEATURE_EMPTY_DOC_RETURNS_OK)
@@
-662,18
+647,13
@@
struct http_response *block_url(struct client_state *csp)
* Return a 200 OK status for pages blocked with +handle-as-empty-document
* if the "handle-as-empty-doc-returns-ok" runtime config option is set.
*/
* Return a 200 OK status for pages blocked with +handle-as-empty-document
* if the "handle-as-empty-doc-returns-ok" runtime config option is set.
*/
- rsp->status = strdup("200 Request blocked by Privoxy");
+ rsp->status = strdup
_or_die
("200 Request blocked by Privoxy");
}
else
{
}
else
{
- rsp->status = strdup("403 Request blocked by Privoxy");
+ rsp->status = strdup
_or_die
("403 Request blocked by Privoxy");
}
}
- if (rsp->status == NULL)
- {
- free_http_response(rsp);
- return cgi_error_memory();
- }
if (new_content_type != 0)
{
log_error(LOG_LEVEL_HEADER, "Overwriting Content-Type with %s", new_content_type);
if (new_content_type != 0)
{
log_error(LOG_LEVEL_HEADER, "Overwriting Content-Type with %s", new_content_type);
@@
-693,12
+673,7
@@
struct http_response *block_url(struct client_state *csp)
jb_err err;
struct map * exports;
jb_err err;
struct map * exports;
- rsp->status = strdup("403 Request blocked by Privoxy");
- if (rsp->status == NULL)
- {
- free_http_response(rsp);
- return cgi_error_memory();
- }
+ rsp->status = strdup_or_die("403 Request blocked by Privoxy");
exports = default_exports(csp, NULL);
if (exports == NULL)
exports = default_exports(csp, NULL);
if (exports == NULL)
@@
-802,9
+777,9
@@
struct http_response *trust_url(struct client_state *csp)
return cgi_error_memory();
}
return cgi_error_memory();
}
- rsp->status = strdup("403 Request blocked by Privoxy");
+ rsp->status = strdup
_or_die
("403 Request blocked by Privoxy");
exports = default_exports(csp, NULL);
exports = default_exports(csp, NULL);
- if (exports == NULL
|| rsp->status == NULL
)
+ if (exports == NULL)
{
free_http_response(rsp);
return cgi_error_memory();
{
free_http_response(rsp);
return cgi_error_memory();
@@
-836,7
+811,7
@@
struct http_response *trust_url(struct client_state *csp)
/*
* Export the trust list
*/
/*
* Export the trust list
*/
- p = strdup("");
+ p = strdup
_or_die
("");
for (tl = csp->config->trust_list; (t = *tl) != NULL ; tl++)
{
snprintf(buf, sizeof(buf), "<li>%s</li>\n", t->spec);
for (tl = csp->config->trust_list; (t = *tl) != NULL ; tl++)
{
snprintf(buf, sizeof(buf), "<li>%s</li>\n", t->spec);
@@
-858,7
+833,7
@@
struct http_response *trust_url(struct client_state *csp)
{
struct list_entry *l;
{
struct list_entry *l;
- p = strdup("");
+ p = strdup
_or_die
("");
for (l = csp->config->trust_info->first; l ; l = l->next)
{
snprintf(buf, sizeof(buf), "<li> <a href=\"%s\">%s</a><br>\n", l->str, l->str);
for (l = csp->config->trust_info->first; l ; l = l->next)
{
snprintf(buf, sizeof(buf), "<li> <a href=\"%s\">%s</a><br>\n", l->str, l->str);
@@
-1131,14
+1106,8
@@
char *get_last_url(char *subject, const char *redirect_mode)
}
if (NULL != url_segment)
{
}
if (NULL != url_segment)
{
- url_segment = strdup(url_segment);
+ url_segment = strdup
_or_die
(url_segment);
freez(dtoken);
freez(dtoken);
- if (url_segment == NULL)
- {
- log_error(LOG_LEVEL_ERROR,
- "Out of memory while searching for redirects.");
- return NULL;
- }
break;
}
freez(dtoken);
break;
}
freez(dtoken);
@@
-1324,8
+1293,8
@@
struct http_response *redirect_url(struct client_state *csp)
return cgi_error_memory();
}
return cgi_error_memory();
}
- if (enlist_unique_header(rsp->headers, "Location", new_url)
-
|| (NULL == (rsp->status = strdup("302 Local Redirect from Privoxy"))
))
+ rsp->status = strdup_or_die("302 Local Redirect from Privoxy");
+
if (enlist_unique_header(rsp->headers, "Location", new_url
))
{
freez(new_url);
free_http_response(rsp);
{
freez(new_url);
free_http_response(rsp);
@@
-1470,7
+1439,7
@@
int is_untrusted_url(const struct client_state *csp)
{
char * path;
char * path_end;
{
char * path;
char * path_end;
- char * new_entry = strdup("~");
+ char * new_entry = strdup
_or_die
("~");
string_append(&new_entry, csp->http->hostport);
string_append(&new_entry, csp->http->hostport);
@@
-1876,6
+1845,7
@@
static char *execute_external_filter(const struct client_state *csp,
{
log_error(LOG_LEVEL_ERROR, "fwrite(..., %d, 1, ..) failed: %E", *size);
unlink(file_name);
{
log_error(LOG_LEVEL_ERROR, "fwrite(..., %d, 1, ..) failed: %E", *size);
unlink(file_name);
+ fclose(fp);
return NULL;
}
fclose(fp);
return NULL;
}
fclose(fp);
@@
-1906,7
+1876,8
@@
static char *execute_external_filter(const struct client_state *csp,
return NULL;
}
return NULL;
}
- filter_output = malloc_or_die(*size);
+ /* Allocate at least one byte */
+ filter_output = malloc_or_die(*size + 1);
new_size = 0;
while (!feof(fp) && !ferror(fp))
new_size = 0;
while (!feof(fp) && !ferror(fp))
@@
-1920,7
+1891,7
@@
static char *execute_external_filter(const struct client_state *csp,
char *p;
/* Could be considered wasteful if the content is 'large'. */
char *p;
/* Could be considered wasteful if the content is 'large'. */
- *size
= (*size != 0) ? *size * 2
: READ_LENGTH;
+ *size
+= (*size >= READ_LENGTH) ? *size
: READ_LENGTH;
p = realloc(filter_output, *size);
if (p == NULL)
p = realloc(filter_output, *size);
if (p == NULL)
@@
-1931,6
+1902,7
@@
static char *execute_external_filter(const struct client_state *csp,
}
filter_output = p;
}
}
filter_output = p;
}
+ assert(new_size + READ_LENGTH < *size);
len = fread(&filter_output[new_size], 1, READ_LENGTH, fp);
if (len > 0)
{
len = fread(&filter_output[new_size], 1, READ_LENGTH, fp);
if (len > 0)
{
@@
-2044,7
+2016,6
@@
static filter_function_ptr get_filter_function(const struct client_state *csp)
* the content type and action settings.
*/
if ((csp->content_type & CT_TEXT) &&
* the content type and action settings.
*/
if ((csp->content_type & CT_TEXT) &&
- (csp->rlist != NULL) &&
(!list_is_empty(csp->action->multi[ACTION_MULTI_FILTER])))
{
filter_function = pcrs_filter_response;
(!list_is_empty(csp->action->multi[ACTION_MULTI_FILTER])))
{
filter_function = pcrs_filter_response;
@@
-2257,7
+2228,6
@@
char *execute_content_filters(struct client_state *csp)
#ifdef FEATURE_EXTERNAL_FILTERS
if ((csp->content_type & CT_TEXT) &&
#ifdef FEATURE_EXTERNAL_FILTERS
if ((csp->content_type & CT_TEXT) &&
- (csp->rlist != NULL) &&
!list_is_empty(csp->action->multi[ACTION_MULTI_EXTERNAL_FILTER]))
{
struct list_entry *filtername;
!list_is_empty(csp->action->multi[ACTION_MULTI_EXTERNAL_FILTER]))
{
struct list_entry *filtername;
@@
-2272,7
+2242,15
@@
char *execute_content_filters(struct client_state *csp)
for (filtername = csp->action->multi[ACTION_MULTI_EXTERNAL_FILTER]->first;
filtername ; filtername = filtername->next)
{
for (filtername = csp->action->multi[ACTION_MULTI_EXTERNAL_FILTER]->first;
filtername ; filtername = filtername->next)
{
- content = execute_external_filter(csp, filtername->str, content, &size);
+ char *result = execute_external_filter(csp, filtername->str, content, &size);
+ if (result != NULL)
+ {
+ if (content != csp->iob->cur)
+ {
+ free(content);
+ }
+ content = result;
+ }
}
csp->flags |= CSP_FLAG_MODIFIED;
csp->content_length = size;
}
csp->flags |= CSP_FLAG_MODIFIED;
csp->content_length = size;
@@
-2582,12
+2560,7
@@
struct http_response *direct_response(struct client_state *csp)
return cgi_error_memory();
}
return cgi_error_memory();
}
- if (NULL == (rsp->status = strdup("501 Not Implemented")))
- {
- free_http_response(rsp);
- return cgi_error_memory();
- }
-
+ rsp->status = strdup_or_die("501 Not Implemented");
rsp->is_static = 1;
rsp->crunch_reason = UNSUPPORTED;
rsp->is_static = 1;
rsp->crunch_reason = UNSUPPORTED;
@@
-2659,7
+2632,6
@@
int content_requires_filtering(struct client_state *csp)
* the content type and action settings.
*/
if ((csp->content_type & CT_TEXT) &&
* the content type and action settings.
*/
if ((csp->content_type & CT_TEXT) &&
- (csp->rlist != NULL) &&
(!list_is_empty(csp->action->multi[ACTION_MULTI_FILTER]) ||
!list_is_empty(csp->action->multi[ACTION_MULTI_EXTERNAL_FILTER])))
{
(!list_is_empty(csp->action->multi[ACTION_MULTI_FILTER]) ||
!list_is_empty(csp->action->multi[ACTION_MULTI_EXTERNAL_FILTER])))
{