Author: rhuijben
Date: Mon Nov 16 18:11:07 2015
New Revision: 1714648

URL: http://svn.apache.org/viewvc?rev=1714648&view=rev
Log:
Following up on r1714539, fix a problem in the incoming request parsing
that somehow caused bodies to be read as headers without failing the test.

* buckets/request_buckets.c
  (serf_incoming_rq_parse_rqline,
   serf_incoming_rq_parse_headerline): Check linebuf state.
  (serf_incoming_rq_wait_for): Only error on error states.

Modified:
    serf/trunk/buckets/request_buckets.c

Modified: serf/trunk/buckets/request_buckets.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/buckets/request_buckets.c?rev=1714648&r1=1714647&r2=1714648&view=diff
==============================================================================
--- serf/trunk/buckets/request_buckets.c (original)
+++ serf/trunk/buckets/request_buckets.c Mon Nov 16 18:11:07 2015
@@ -327,6 +327,9 @@ static apr_status_t serf_incoming_rq_par
     const char *spc, *spc2;
     int res;
 
+    if (ctx->linebuf.state != SERF_LINEBUF_READY)
+        return APR_SUCCESS;
+
     if (ctx->linebuf.used == 0) {
         return SERF_ERROR_TRUNCATED_STREAM;
     }
@@ -371,6 +374,9 @@ static apr_status_t serf_incoming_rq_par
     incoming_request_context_t *ctx = bucket->data;
     const char *split;
 
+    if (ctx->linebuf.state != SERF_LINEBUF_READY)
+        return APR_SUCCESS;
+
     if (ctx->linebuf.used == 0) {
         ctx->state++;
         return APR_SUCCESS;
@@ -392,7 +398,7 @@ static apr_status_t serf_incoming_rq_wai
                                               incoming_rq_status_t wait_for)
 {
     incoming_request_context_t *ctx = bucket->data;
-    apr_status_t status;
+    apr_status_t read_status, status;
 
     if (ctx->state == STATE_TRAILERS && wait_for == STATE_BODY) {
         /* We are done with the body, but not with the request.
@@ -403,25 +409,25 @@ static apr_status_t serf_incoming_rq_wai
     while (ctx->state < wait_for) {
         switch (ctx->state) {
             case STATE_INIT:
-                status = serf_linebuf_fetch(&ctx->linebuf, ctx->stream,
-                                            SERF_NEWLINE_ANY);
-                if (status)
-                    return status;
+                read_status = serf_linebuf_fetch(&ctx->linebuf, ctx->stream,
+                                                 SERF_NEWLINE_ANY);
+                if (SERF_BUCKET_READ_ERROR(read_status))
+                    return read_status;
 
                 status = serf_incoming_rq_parse_rqline(bucket);
-                if (status)
-                    return status;
+                if (status || read_status)
+                    return status ? status : read_status;
                 break;
             case STATE_HEADERS:
             case STATE_TRAILERS:
-                status = serf_linebuf_fetch(&ctx->linebuf, ctx->stream,
-                                            SERF_NEWLINE_ANY);
-                if (status)
-                    return status;
+                read_status = serf_linebuf_fetch(&ctx->linebuf, ctx->stream,
+                                                 SERF_NEWLINE_ANY);
+                if (SERF_BUCKET_READ_ERROR(read_status))
+                    return read_status;
 
                 status = serf_incoming_rq_parse_headerline(bucket);
-                if (status)
-                    return status;
+                if (status || read_status)
+                    return status ? status : read_status;
                 break;
             case STATE_PREBODY:
                 /* TODO: Determine the body type.. Wrap bucket if necessary,


Reply via email to