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,