Philip Martin <philip.mar...@wandisco.com> writes:

> Philip Martin <philip.mar...@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@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:

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
-- 
Philip Martin | Subversion Committer
WANdisco // *Non-Stop Data*

Reply via email to