- Allow port lists in url patterns.
[privoxy.git] / jcc.c
diff --git a/jcc.c b/jcc.c
index 6835ce0..a4e430e 100644 (file)
--- a/jcc.c
+++ b/jcc.c
@@ -1,4 +1,4 @@
-const char jcc_rcs[] = "$Id: jcc.c,v 1.145 2007/08/19 13:13:31 fabiankeil Exp $";
+const char jcc_rcs[] = "$Id: jcc.c,v 1.147 2007/08/25 14:42:40 fabiankeil Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/jcc.c,v $
@@ -33,6 +33,13 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.145 2007/08/19 13:13:31 fabiankeil Exp $"
  *
  * Revisions   :
  *    $Log: jcc.c,v $
+ *    Revision 1.147  2007/08/25 14:42:40  fabiankeil
+ *    Don't crash if a broken header filter wiped out the request line.
+ *
+ *    Revision 1.146  2007/08/20 17:09:32  fabiankeil
+ *    Fix byte_count calculation in case of flushes
+ *    and don't parse the server headers a second time.
+ *
  *    Revision 1.145  2007/08/19 13:13:31  fabiankeil
  *    - If there's a connection problem after we already forwarded
  *      parts of the original content, just hang up. Fixes BR#1776724.
@@ -2141,22 +2148,21 @@ static void chat(struct client_state *csp)
    }
    csp->flags |= CSP_FLAG_CLIENT_HEADER_PARSING_DONE;
 
-   if (strcmp(http->cmd, csp->headers->first->str))
+   /* Check request line for rewrites. */
+   if ((NULL == csp->headers->first->str)
+      || (strcmp(http->cmd, csp->headers->first->str) &&
+         (JB_ERR_OK != change_request_destination(csp))))
    {
       /*
-       * A header filter rewrote the request line,
-       * modify the http request accordingly.
+       * A header filter broke the request line - bail out.
        */
-      if (JB_ERR_OK != change_request_destination(csp))
-      {
-         write_socket(csp->cfd, MESSED_UP_REQUEST_RESPONSE, strlen(MESSED_UP_REQUEST_RESPONSE));
-         /* XXX: Use correct size */
-         log_error(LOG_LEVEL_CLF, "%s - - [%T] \"Invalid request generated\" 500 0", csp->ip_addr_str);
-         log_error(LOG_LEVEL_ERROR, "Invalid request line after applying header filters.");
+      write_socket(csp->cfd, MESSED_UP_REQUEST_RESPONSE, strlen(MESSED_UP_REQUEST_RESPONSE));
+      /* XXX: Use correct size */
+      log_error(LOG_LEVEL_CLF, "%s - - [%T] \"Invalid request generated\" 500 0", csp->ip_addr_str);
+      log_error(LOG_LEVEL_ERROR, "Invalid request line after applying header filters.");
 
-         free_http_request(http);
-         return;
-      }
+      free_http_request(http);
+      return;
    }
 
    /* decide how to route the HTTP request */
@@ -2889,7 +2895,7 @@ static void usage(const char *myname)
 #endif /* defined(unix) */
           "[--help] "
 #if defined(unix)
-          "[--no-daemon] [--pidfile pidfile] [--user user[.group]] "
+          "[--no-daemon] [--pidfile pidfile] [--pre-chroot-nslookup hostname] [--user user[.group]] "
 #endif /* defined(unix) */
           "[--version] [configfile]\n"
           "Aborting\n", myname);
@@ -3002,6 +3008,7 @@ int main(int argc, const char *argv[])
    struct group *grp = NULL;
    char *p;
    int do_chroot = 0;
+   char *pre_chroot_nslookup_to_load_resolver = NULL;
 #endif
 
    Argc = argc;
@@ -3096,6 +3103,12 @@ int main(int argc, const char *argv[])
          if (p != NULL) *--p = '\0';
       }
 
+      else if (strcmp(argv[argc_pos], "--pre-chroot-nslookup" ) == 0)
+      {
+         if (++argc_pos == argc) usage(argv[0]);
+         pre_chroot_nslookup_to_load_resolver = strdup(argv[argc_pos]);
+      }
+
       else if (strcmp(argv[argc_pos], "--chroot" ) == 0)
       {
          do_chroot = 1;
@@ -3304,6 +3317,14 @@ int main(int argc, const char *argv[])
          {
             log_error(LOG_LEVEL_FATAL, "Home directory for %s undefined", pw->pw_name);
          }
+         /* Read the time zone file from /etc before doing chroot. */
+         tzset();
+         if (NULL != pre_chroot_nslookup_to_load_resolver
+             && '\0' != pre_chroot_nslookup_to_load_resolver[0])
+         {
+            /* Initialize resolver library. */
+            (void) resolve_hostname_to_ip(pre_chroot_nslookup_to_load_resolver);
+         }
          if (chroot(pw->pw_dir) < 0)
          {
             log_error(LOG_LEVEL_FATAL, "Cannot chroot to %s", pw->pw_dir);