[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[Libevent-users] libevent 1.4.14b evhttp keep-alive leak

Hi libevent devs,

My company has been using libevent 1.4.14b and evhttp for a minimal
http interface for some daemon processes (a simple queue, a simple
database, etc). I was tracking down some memory issues and found that
HTTP/1.1 requests without the "Connection: close" header, or HTTP/1.0
requests with keep-alive enabled, to a process which uses evhttp to
act as an http server, result in a memory leak if the last request
made over the connection before it's closed doesn't have "Connection:
close". This is rather common, for example if you use curl with
default options to make a request to the process. It also happens if a
connection is opened and closed without sending any requests at all.

My fix is really tiny, and I think elegant and logical:

diff -urp libevent-1.4.14b-stable/http.c libevent-1.4.14b-stable-fix/http.c
--- libevent-1.4.14b-stable/http.c	2010-06-20 09:06:04.000000000 -0400
+++ libevent-1.4.14b-stable-fix/http.c	2012-05-09 14:51:37.000000000 -0400
@@ -2231,6 +2231,7 @@ evhttp_handle_request(struct evhttp_requ
 	if (req->uri == NULL) {
 		event_debug(("%s: bad request", __func__));
 		if (req->evcon->state == EVCON_DISCONNECTED) {
+			req->userdone = 1;
 			evhttp_connection_fail(req->evcon, EVCON_HTTP_EOF);
 		} else {
 			event_debug(("%s: sending error", __func__));

this prevents evhttp_connection_incoming_fail() from leaking the
evhttp_request, which it seemingly intentionally does for reasons I
don't fully understand. But I'm pretty sure that when the client
disconnects, they're done, and the request should go away when the
connection is freed, after the callbacks.

I don't know if libevent-1.4 fixes are no longer accepted, but we
would love it if  this was applied to the 1.4 branch and a new bugfix
release of the 1.4 branch was eventually made.

- Pierce
To unsubscribe, send an e-mail to majordomo@xxxxxxxxxxxxx with
unsubscribe libevent-users    in the body.