On Mon, Apr 13, 2026 at 07:57:29AM -0700, James J. Lippard wrote:
> On Mon, Apr 13, 2026 at 04:32:20PM +0200, Claudio Jeker wrote:
> > Here is a diff that actually applies.
> > 
> > The 2nd hunk is enforcing that Content-Length and Transfer-Encoding:
> > chunked can not co-exist.
> > 
> > -- 
> > :wq Claudio
> > 
> > Index: server_http.c
> > ===================================================================
> > RCS file: /cvs/src/usr.sbin/httpd/server_http.c,v
> > diff -u -p -r1.161 server_http.c
> > --- server_http.c   2 Mar 2026 19:24:58 -0000       1.161
> > +++ server_http.c   13 Apr 2026 14:18:54 -0000
> > @@ -396,8 +396,13 @@ server_read_http(struct bufferevent *bev
> >             }
> >  
> >             if (strcasecmp("Transfer-Encoding", key) == 0 &&
> > -               strcasecmp("chunked", value) == 0)
> > +               strcasecmp("chunked", value) == 0) {
> >                     desc->http_chunked = 1;
> > +           } else {
> > +                   server_abort_http(clt, 400,
> > +                       "malformed transfer-encoding");
> > +                   goto abort;
> > +           }
> >  
> >             if (clt->clt_line != 1) {
> >                     if ((hdr = kv_add(&desc->http_headers, key,
> > @@ -479,6 +484,10 @@ server_read_http(struct bufferevent *bev
> >             case HTTP_METHOD_TRACE:
> >             default:
> >                     server_abort_http(clt, 405, "method not allowed");
> > +                   return;
> > +           }
> > +           if (clt->clt_toread > 0 && desc->http_chunked) {
> > +                   server_abort_http(clt, 400, "malformed");
> >                     return;
> >             }
> >             if (desc->http_chunked) {
> 
> 
> Shouldn't that first part be (as in the original suggested patch):
> 
> if (strcasecmp("Transfer-Encoding", key) == 0) {
>     if (strcasecmp("chunked", value) == 0)
>         desc->http_chunked = 1;
>     else {
>         server_abort_http(clt, 400,
>             "malformed transfer-encoding");
>         goto abort;
>     }
> }
> 
> Otherwise you're going to produce a bunch of incorrect 400 responses for 
> other headers.
> 

Yes. I should not do 3 times at once.

-- 
:wq Claudio

Index: server_http.c
===================================================================
RCS file: /cvs/src/usr.sbin/httpd/server_http.c,v
diff -u -p -r1.161 server_http.c
--- server_http.c       2 Mar 2026 19:24:58 -0000       1.161
+++ server_http.c       13 Apr 2026 15:04:20 -0000
@@ -395,9 +395,15 @@ server_read_http(struct bufferevent *bev
                        }
                }
 
-               if (strcasecmp("Transfer-Encoding", key) == 0 &&
-                   strcasecmp("chunked", value) == 0)
-                       desc->http_chunked = 1;
+               if (strcasecmp("Transfer-Encoding", key) == 0) {
+                       if (strcasecmp("chunked", value) == 0) {
+                               desc->http_chunked = 1;
+                       } else {
+                               server_abort_http(clt, 400,
+                                   "malformed transfer-encoding");
+                               goto abort;
+                       }
+               }
 
                if (clt->clt_line != 1) {
                        if ((hdr = kv_add(&desc->http_headers, key,
@@ -479,6 +485,10 @@ server_read_http(struct bufferevent *bev
                case HTTP_METHOD_TRACE:
                default:
                        server_abort_http(clt, 405, "method not allowed");
+                       return;
+               }
+               if (clt->clt_toread > 0 && desc->http_chunked) {
+                       server_abort_http(clt, 400, "malformed");
                        return;
                }
                if (desc->http_chunked) {

Reply via email to