Add www.proxidize.com as Bronze level sponsor
[privoxy.git] / cgi.c
diff --git a/cgi.c b/cgi.c
index e03084e..d60166f 100644 (file)
--- a/cgi.c
+++ b/cgi.c
@@ -7,7 +7,7 @@
  *                This only contains the framework functions, the
  *                actual handler functions are declared elsewhere.
  *
- * Copyright   :  Written by and Copyright (C) 2001-2020
+ * Copyright   :  Written by and Copyright (C) 2001-2021
  *                members of the Privoxy team. https://www.privoxy.org/
  *
  *                Based on the Internet Junkbuster originally written
@@ -221,6 +221,9 @@ static const struct cgi_dispatcher cgi_dispatchers[] = {
    { "user-manual",
           cgi_send_user_manual,
           NULL, TRUE /* Send user-manual */ },
+   { "wpad.dat",
+         cgi_send_wpad,
+         NULL, TRUE /* Send wpad.dat proxy autoconfiguration file */ },
    { NULL, /* NULL Indicates end of list and default page */
          cgi_error_404,
          NULL, TRUE /* Unknown CGI page */ }
@@ -663,16 +666,7 @@ static struct map *parse_cgi_parameters(char *argstring)
     *      The same hack is used in get_last_url() so it looks like
     *      a real solution is needed.
     */
-   size_t max_segments = strlen(argstring) / 2;
-   if (max_segments == 0)
-   {
-      /*
-       * XXX: If the argstring is empty, there's really
-       *      no point in creating a param list, but currently
-       *      other parts of Privoxy depend on the list's existence.
-       */
-      max_segments = 1;
-   }
+   size_t max_segments = strlen(argstring) / 2 + 1;
    vector = malloc_or_die(max_segments * sizeof(char *));
 
    cgi_params = new_map();
@@ -1205,7 +1199,8 @@ jb_err cgi_error_no_template(const struct client_state *csp,
       ").</p>\n"
       "</body>\n"
       "</html>\n";
-   const size_t body_size = strlen(body_prefix) + strlen(template_name) + strlen(body_suffix) + 1;
+   size_t body_size = strlen(body_prefix) + strlen(body_suffix) + 1;
+   const char *encoded_template_name;
 
    assert(csp);
    assert(rsp);
@@ -1219,9 +1214,17 @@ jb_err cgi_error_no_template(const struct client_state *csp,
    rsp->head_length = 0;
    rsp->is_static = 0;
 
+   encoded_template_name = html_encode(template_name);
+   if (encoded_template_name == NULL)
+   {
+      return JB_ERR_MEMORY;
+   }
+
+   body_size += strlen(encoded_template_name);
    rsp->body = malloc_or_die(body_size);
    strlcpy(rsp->body, body_prefix, body_size);
-   strlcat(rsp->body, template_name, body_size);
+   strlcat(rsp->body, encoded_template_name, body_size);
+   freez(encoded_template_name);
    strlcat(rsp->body, body_suffix, body_size);
 
    rsp->status = strdup(status);
@@ -2020,7 +2023,7 @@ jb_err template_fill(char **template_ptr, const struct map *exports)
    char buf[BUFFER_SIZE];
    char *tmp_out_buffer;
    char *file_buffer;
-   size_t size;
+   size_t buffer_size, new_size;
    int error;
    const char *flags;
 
@@ -2029,7 +2032,7 @@ jb_err template_fill(char **template_ptr, const struct map *exports)
    assert(exports);
 
    file_buffer = *template_ptr;
-   size = strlen(file_buffer) + 1;
+   buffer_size = strlen(file_buffer) + 1;
 
    /*
     * Assemble pcrs joblist from exports map
@@ -2079,7 +2082,10 @@ jb_err template_fill(char **template_ptr, const struct map *exports)
       }
       else
       {
-         error = pcrs_execute(job, file_buffer, size, &tmp_out_buffer, &size);
+         error = pcrs_execute(job, file_buffer, buffer_size, &tmp_out_buffer,
+            &new_size);
+
+         buffer_size = new_size;
 
          pcrs_free_job(job);
          if (NULL == tmp_out_buffer)
@@ -2216,11 +2222,7 @@ struct map *default_exports(const struct client_state *csp, const char *caller)
    if (!err) err = map(exports, "homepage",      1, html_encode(HOME_PAGE_URL), 0);
    if (!err)
    {
-      err = map(exports, "default-cgi",   1, html_encode(
-#ifdef FEATURE_HTTPS_INSPECTION
-        client_use_ssl(csp) ? CGI_PREFIX_HTTPS :
-#endif
-        CGI_PREFIX), 0);
+      err = map(exports, "default-cgi",   1, html_encode(CGI_PREFIX), 0);
    }
    if (!err) err = map(exports, "menu",          1, make_menu(csp, caller), 0);
    if (!err) err = map(exports, "code-status",   1, CODE_STATUS, 1);
@@ -2235,11 +2237,7 @@ struct map *default_exports(const struct client_state *csp, const char *caller)
       /* Manual is delivered by Privoxy. */
       if (!err)
       {
-         err = map(exports, "user-manual", 1, html_encode(
-#ifdef FEATURE_HTTPS_INSPECTION
-           client_use_ssl(csp) ? CGI_PREFIX_HTTPS"user-manual/" :
-#endif
-           CGI_PREFIX"user-manual/"), 0);
+         err = map(exports, "user-manual", 1, html_encode(CGI_PREFIX"user-manual/"), 0);
       }
    }
    if (!err) err = map(exports, "actions-help-prefix", 1, ACTIONS_HELP_PREFIX ,1);
@@ -2457,11 +2455,7 @@ char *make_menu(const struct client_state *csp, const char *self)
           * the "blocked" template's JavaScript.
           */
          string_append(&result, "<li><a href=\"");
-         html_encoded_prefix = html_encode(
-#ifdef FEATURE_HTTPS_INSPECTION
-            client_use_ssl(csp) ? CGI_PREFIX_HTTPS :
-#endif
-            CGI_PREFIX);
+         html_encoded_prefix = html_encode(CGI_PREFIX);
          if (html_encoded_prefix == NULL)
          {
             return NULL;