X-Git-Url: http://www.privoxy.org/gitweb/?a=blobdiff_plain;f=filters.c;h=1fc1c476b7e140a0baec9e3e2defc6501e7f89e1;hb=8ee7f337d9dda6875f15cab70475febd9ae9488a;hp=31f528e735d4420a86336b0532092ac27bcf1507;hpb=ec87f837d4ead511a94466661b8afff643e0d207;p=privoxy.git
diff --git a/filters.c b/filters.c
index 31f528e7..1fc1c476 100644
--- a/filters.c
+++ b/filters.c
@@ -1,4 +1,4 @@
-const char filters_rcs[] = "$Id: filters.c,v 1.183 2014/06/03 10:29:40 fabiankeil Exp $";
+const char filters_rcs[] = "$Id: filters.c,v 1.191 2014/10/18 11:28:36 fabiankeil Exp $";
/*********************************************************************
*
* 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.
*/
- 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)
{
@@ -582,12 +577,7 @@ struct http_response *block_url(struct client_state *csp)
/* 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)
{
@@ -604,12 +594,7 @@ struct http_response *block_url(struct client_state *csp)
}
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)
{
@@ -626,12 +611,7 @@ struct http_response *block_url(struct client_state *csp)
}
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))
{
@@ -651,7 +631,7 @@ struct http_response *block_url(struct client_state *csp)
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)
@@ -662,18 +642,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.
*/
- rsp->status = strdup("200 Request blocked by Privoxy");
+ rsp->status = strdup_or_die("200 Request blocked by Privoxy");
}
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);
@@ -693,12 +668,7 @@ struct http_response *block_url(struct client_state *csp)
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)
@@ -802,9 +772,9 @@ struct http_response *trust_url(struct client_state *csp)
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);
- if (exports == NULL || rsp->status == NULL)
+ if (exports == NULL)
{
free_http_response(rsp);
return cgi_error_memory();
@@ -836,7 +806,7 @@ struct http_response *trust_url(struct client_state *csp)
/*
* Export the trust list
*/
- p = strdup("");
+ p = strdup_or_die("");
for (tl = csp->config->trust_list; (t = *tl) != NULL ; tl++)
{
snprintf(buf, sizeof(buf), "
%s\n", t->spec);
@@ -858,7 +828,7 @@ struct http_response *trust_url(struct client_state *csp)
{
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), " %s
\n", l->str, l->str);
@@ -1131,14 +1101,8 @@ char *get_last_url(char *subject, const char *redirect_mode)
}
if (NULL != url_segment)
{
- url_segment = strdup(url_segment);
+ url_segment = strdup_or_die(url_segment);
freez(dtoken);
- if (url_segment == NULL)
- {
- log_error(LOG_LEVEL_ERROR,
- "Out of memory while searching for redirects.");
- return NULL;
- }
break;
}
freez(dtoken);
@@ -1238,11 +1202,14 @@ struct http_response *redirect_url(struct client_state *csp)
* properly formatted URL and use it for the redirection
* directly.
*
- * According to RFC 2616 section 14.30 the URL
- * has to be absolute and if the user tries:
- * +redirect{shit/this/will/be/parsed/as/pcrs_command.html}
+ * According to (the now obsolete) RFC 2616 section 14.30
+ * the URL has to be absolute and if the user tries:
+ * +redirect{sadly/this/will/be/parsed/as/pcrs_command.html}
* she would get undefined results anyway.
*
+ * RFC 7231 7.1.2 actually allows relative references,
+ * but those start with a leading slash (RFC 3986 4.2) and
+ * thus can't be mistaken for pcrs commands either.
*/
if (*redirection_string == 's')
@@ -1321,8 +1288,8 @@ struct http_response *redirect_url(struct client_state *csp)
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);
@@ -1467,7 +1434,7 @@ int is_untrusted_url(const struct client_state *csp)
{
char * path;
char * path_end;
- char * new_entry = strdup("~");
+ char * new_entry = strdup_or_die("~");
string_append(&new_entry, csp->http->hostport);
@@ -1873,6 +1840,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);
+ fclose(fp);
return NULL;
}
fclose(fp);
@@ -2041,7 +2009,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) &&
- (csp->rlist != NULL) &&
(!list_is_empty(csp->action->multi[ACTION_MULTI_FILTER])))
{
filter_function = pcrs_filter_response;
@@ -2061,7 +2028,8 @@ static filter_function_ptr get_filter_function(const struct client_state *csp)
* Function : remove_chunked_transfer_coding
*
* Description : In-situ remove the "chunked" transfer coding as defined
- * in rfc2616 from a buffer.
+ * in RFC 7230 4.1 from a buffer. XXX: The implementation
+ * is neither complete nor compliant (TODO #129).
*
* Parameters :
* 1 : buffer = Pointer to the text buffer
@@ -2253,7 +2221,6 @@ char *execute_content_filters(struct client_state *csp)
#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;
@@ -2268,7 +2235,15 @@ char *execute_content_filters(struct client_state *csp)
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;
@@ -2375,7 +2350,7 @@ void apply_url_actions(struct current_action_spec *action,
* Invalid syntax is fatal.
*
*********************************************************************/
-const static struct forward_spec *get_forward_override_settings(struct client_state *csp)
+static const struct forward_spec *get_forward_override_settings(struct client_state *csp)
{
const char *forward_override_line = csp->action->string[ACTION_STRING_FORWARD_OVERRIDE];
char forward_settings[BUFFER_SIZE];
@@ -2578,12 +2553,7 @@ struct http_response *direct_response(struct client_state *csp)
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;
@@ -2655,7 +2625,6 @@ int content_requires_filtering(struct client_state *csp)
* 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])))
{