[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: [serf-dev] Re: [PATCH] Serf crash on spurious data between responses

From: Lieven Govaerts <lgo_at_mobsol.be>
Date: Mon, 12 Jan 2015 11:41:06 +0100

Hi,

On Sat, Jan 10, 2015 at 1:07 PM, Philip Martin
<philip.martin_at_wandisco.com> wrote:
> Philip Martin <philip.martin_at_wandisco.com> writes:
>
>> Philip Martin <philip.martin_at_wandisco.com> writes:
>>
>>> While debugging a problem reported on users I accidentally sent an extra
>>> byte to the client: I sent Content-Length of N and then sent N+1 bytes.
>>> The first N bytes made a valid response, so serf was happy at that
>>> stage. When processing the next request the extra byte causes serf to
>>> attempt to handle the spurious data before any request handler is setup.
>>> This is with serf 1.3.x_at_2440.
>>
>> Here's a patch that causes serf to return an error if this sort of
>> spurious data is received:
>>
>> Index: outgoing.c
>> ===================================================================
>> --- outgoing.c (revision 2445)
>> +++ outgoing.c (working copy)
>> @@ -1109,7 +1109,11 @@ static apr_status_t read_from_connection(serf_conn
>> goto error;
>> }
>>
>> - /* Unexpected response from the server */
>> + /* Unexpected response from the server. This can happen if
>> + * a buggy server sends more than Content-Length data.
>> + */
>> + status = SERF_ERROR_BAD_HTTP_RESPONSE;
>> + goto error;
>>
>> }
>
> That breaks HTTPS negotiation. This works:

Does serf-'s test suite capture this situation?
What do you see here? I suppose status == APR_SUCCESS with 0 bytes of data?

>
> Index: outgoing.c
> ===================================================================
> --- outgoing.c (revision 2445)
> +++ outgoing.c (working copy)
> @@ -1109,8 +1109,14 @@
> goto error;
> }
>
> - /* Unexpected response from the server */
> -
> + if (!request->req_bkt) {
> + /* Unexpected response from the server. This can happen if
> + * a buggy server sends more than Content-Length data.
> + */
> + status = SERF_ERROR_BAD_HTTP_RESPONSE;
> + goto error;
> + }
> +
> }
>
> /* If the request doesn't have a response bucket, then call the

You're trying to capture the situation where serf has:
- finished writing a request ( req_bkt == NULL && writing_started )
- has no more requests in the pending queue
- and receives actual bytes of data.
Right?

Looks like your patch is a correct way to fix the problem. Some
comments would be welcome, and if you have the time a test.

I should have some time this weekend to have a go at a test and commit.

Lieven
Received on 2015-01-12 11:41:55 CET

This is an archived mail posted to the Subversion Dev mailing list.