From: Timo Sirainen Date: Tue, 5 Aug 2014 15:43:31 +0000 (+0200) Subject: lib-http server: Require handle_request() to either send a response or reference... X-Git-Tag: 2.2.14.rc1~189 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=738561f5fadf23f947a92a59b3d08bc34008ed40;p=thirdparty%2Fdovecot%2Fcore.git lib-http server: Require handle_request() to either send a response or reference the request. This should make it more difficult to accidentally forget to send a response and cause a hang. Currently this assert-crashes, although it would have been possible to make it return some internal error instead also. --- diff --git a/src/lib-http/http-server-connection.c b/src/lib-http/http-server-connection.c index f0bcdf8cc1..9931134712 100644 --- a/src/lib-http/http-server-connection.c +++ b/src/lib-http/http-server-connection.c @@ -259,7 +259,12 @@ static void http_server_connection_request_callback( http_server_request_fail(req, 505, "Not Implemented"); return; } else { + unsigned int old_refcount = req->refcount; + conn->callbacks->handle_request(conn->context, req); + i_assert((req->response != NULL && + req->response->submitted) || + req->refcount > old_refcount); } } } diff --git a/src/lib-http/http-server.h b/src/lib-http/http-server.h index fe87fe05a4..961d9259ae 100644 --- a/src/lib-http/http-server.h +++ b/src/lib-http/http-server.h @@ -38,6 +38,10 @@ struct http_server_tunnel { }; struct http_server_callbacks { + /* Reference the server request. Before returning you must either send + a response to the request or reference the request with + http_server_request_ref() and unreference it later after sending + the response. */ void (*handle_request)(void *context, struct http_server_request *req); void (*handle_connect_request)(void *context, struct http_server_request *req, struct http_url *target);