Let sed() failures result in an error response
authorFabian Keil <fk@fabiankeil.de>
Fri, 25 Jul 2014 11:56:54 +0000 (11:56 +0000)
committerFabian Keil <fk@fabiankeil.de>
Fri, 25 Jul 2014 11:56:54 +0000 (11:56 +0000)
While at it, make sure fatal parse errors are reported
to the caller right away.

jcc.c
parsers.c

diff --git a/jcc.c b/jcc.c
index ef8c77f..a665d18 100644 (file)
--- a/jcc.c
+++ b/jcc.c
@@ -1,4 +1,4 @@
-const char jcc_rcs[] = "$Id: jcc.c,v 1.428 2014/06/03 10:25:57 fabiankeil Exp $";
+const char jcc_rcs[] = "$Id: jcc.c,v 1.429 2014/07/25 11:55:11 fabiankeil Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/jcc.c,v $
@@ -1709,9 +1709,12 @@ static jb_err parse_client_request(struct client_state *csp)
    err = sed(csp, FILTER_CLIENT_HEADERS);
    if (JB_ERR_OK != err)
    {
-      /* XXX: Should be handled in sed(). */
-      assert(err == JB_ERR_PARSE);
-      log_error(LOG_LEVEL_FATAL, "Failed to parse client headers.");
+      log_error(LOG_LEVEL_ERROR, "Failed to parse client request from %s.",
+         csp->ip_addr_str);
+      log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 400 0",
+         csp->ip_addr_str, csp->http->cmd);
+      write_socket(csp->cfd, CHEADER, strlen(CHEADER));
+      return JB_ERR_PARSE;
    }
    csp->flags |= CSP_FLAG_CLIENT_HEADER_PARSING_DONE;
 
@@ -2594,7 +2597,13 @@ static void chat(struct client_state *csp)
              */
             if (JB_ERR_OK != sed(csp, FILTER_SERVER_HEADERS))
             {
-               log_error(LOG_LEVEL_FATAL, "Failed to parse server headers.");
+               log_error(LOG_LEVEL_CLF,
+                  "%s - - [%T] \"%s\" 502 0", csp->ip_addr_str, http->cmd);
+               write_socket(csp->cfd, INVALID_SERVER_HEADERS_RESPONSE,
+                  strlen(INVALID_SERVER_HEADERS_RESPONSE));
+               free_http_request(http);
+               mark_server_socket_tainted(csp);
+               return;
             }
             hdr = list_to_text(csp->headers);
             if (hdr == NULL)
index c5f7a08..3a2b4fe 100644 (file)
--- a/parsers.c
+++ b/parsers.c
@@ -1,4 +1,4 @@
-const char parsers_rcs[] = "$Id: parsers.c,v 1.289 2014/07/25 11:55:47 fabiankeil Exp $";
+const char parsers_rcs[] = "$Id: parsers.c,v 1.290 2014/07/25 11:56:02 fabiankeil Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/parsers.c,v $
@@ -1115,7 +1115,8 @@ static void enforce_header_order(struct list *headers, const struct list *ordere
  *                                        server and header filtering.
  *
  * Returns     :  JB_ERR_OK in case off success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ *                JB_ERR_MEMORY on some out-of-memory errors, or
+ *                JB_ERR_PARSE in case of fatal parse errors.
  *
  *********************************************************************/
 jb_err sed(struct client_state *csp, int filter_server_headers)
@@ -1141,9 +1142,9 @@ jb_err sed(struct client_state *csp, int filter_server_headers)
       check_negative_tag_patterns(csp, PATTERN_SPEC_NO_REQUEST_TAG_PATTERN);
    }
 
-   while ((err == JB_ERR_OK) && (v->str != NULL))
+   while (v->str != NULL)
    {
-      for (p = csp->headers->first; (err == JB_ERR_OK) && (p != NULL); p = p->next)
+      for (p = csp->headers->first; p != NULL; p = p->next)
       {
          /* Header crunch()ed in previous run? -> ignore */
          if (p->str == NULL) continue;
@@ -1153,6 +1154,10 @@ jb_err sed(struct client_state *csp, int filter_server_headers)
              (v->len == CHECK_EVERY_HEADER_REMAINING))
          {
             err = v->parser(csp, &(p->str));
+            if (err != JB_ERR_OK)
+            {
+               return err;
+            }
          }
       }
       v++;