Hi Claudio,

This prevents undeadly.org from crashing when I send it the query I
got from Florian.  Thanks a lot!

Paul

On Thu, Nov 11, 2021 at 04:41:21PM +0100, Claudio Jeker wrote:
| On Thu, Nov 11, 2021 at 04:29:58PM +0100, Otto Moerbeek wrote:
| > On Thu, Nov 11, 2021 at 04:13:37PM +0100, Florian Obser wrote:
| > 
| > > 
| > > No idea how to reproduce this, I'm just running an httpd with debug
| > > symbols and kern.nosuidcoredump=3
| > > Pretty sure this is the crash various people mumbled about.
| > > 
| > > Smells like a use-after-fruit to me.
| > 
| > In server_http.c:351 desc->http_query is set to point in the middle of
| > a string.  In the cases of goto fail belows that it will not be
| > strdupped.  A free of desc->http_query then later bombs.
| > 
| 
| I debugged something like this with tobhe@ the other day. I remember I
| mentioned to benno@ to look out for this dumb pattern of first assigning a
| variable and then doing variable = strdup(variable). He fixed one case but
| forgot the other.
| 
| I think all this http_query handling can be moved down and while at it use
| a local variable as well.
| 
| -- 
| :wq Claudio
| 
| Index: server_http.c
| ===================================================================
| RCS file: /cvs/src/usr.sbin/httpd/server_http.c,v
| retrieving revision 1.148
| diff -u -p -r1.148 server_http.c
| --- server_http.c     5 Nov 2021 19:01:02 -0000       1.148
| +++ server_http.c     11 Nov 2021 15:36:41 -0000
| @@ -228,7 +228,7 @@ server_read_http(struct bufferevent *bev
|       struct evbuffer         *src = EVBUFFER_INPUT(bev);
|       char                    *line = NULL, *key, *value;
|       const char              *errstr;
| -     char                    *http_version;
| +     char                    *http_version, *query;
|       size_t                   size, linelen;
|       int                      version;
|       struct kv               *hdr = NULL;
| @@ -348,9 +348,6 @@ server_read_http(struct bufferevent *bev
|                       }
|  
|                       *http_version++ = '\0';
| -                     desc->http_query = strchr(desc->http_path, '?');
| -                     if (desc->http_query != NULL)
| -                             *desc->http_query++ = '\0';
|  
|                       /*
|                        * We have to allocate the strings because they could
| @@ -378,10 +375,13 @@ server_read_http(struct bufferevent *bev
|                                       goto fail;
|                       }
|  
| -                     if (desc->http_query != NULL &&
| -                         (desc->http_query =
| -                         strdup(desc->http_query)) == NULL)
| -                             goto fail;
| +                     query = strchr(desc->http_path, '?');
| +                     if (query != NULL) {
| +                             *query++ = '\0';
| +
| +                             if ((desc->http_query = strdup(query)) == NULL)
| +                                     goto fail;
| +                     }
|  
|               } else if (desc->http_method != HTTP_METHOD_NONE &&
|                   strcasecmp("Content-Length", key) == 0) {
| 

-- 
>++++++++[<++++++++++>-]<+++++++.>+++[<------>-]<.>+++[<+
+++++++++++>-]<.>++[<------------>-]<+.--------------.[-]
                 http://www.weirdnet.nl/                 

Reply via email to