summaryrefslogtreecommitdiff
path: root/source4/web_server/web_server.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/web_server/web_server.c')
-rw-r--r--source4/web_server/web_server.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/source4/web_server/web_server.c b/source4/web_server/web_server.c
index 4962185526..e85c4f20c7 100644
--- a/source4/web_server/web_server.c
+++ b/source4/web_server/web_server.c
@@ -52,7 +52,11 @@ static void websrv_timeout(struct event_context *event_context,
struct timeval t, void *private)
{
struct websrv_context *web = talloc_get_type(private, struct websrv_context);
- stream_terminate_connection(web->conn, "websrv_timeout: timed out");
+ struct stream_connection *conn = web->conn;
+ web->conn = NULL;
+ /* TODO: send a message to any running esp context on this connection
+ to stop running */
+ stream_terminate_connection(conn, "websrv_timeout: timed out");
}
/*
@@ -108,7 +112,17 @@ static void websrv_recv(struct stream_connection *conn, uint16_t flags)
web->input.partial.data[web->input.content_length] = 0;
}
EVENT_FD_NOT_READABLE(web->conn->event.fde);
+
+ /* the reference/unlink code here is quite subtle. It
+ is needed because the rendering of the web-pages, and
+ in particular the esp/ejs backend, is semi-async. So
+ we could well end up in the connection timeout code
+ while inside http_process_input(), but we must not
+ destroy the stack variables being used by that
+ rendering process when we handle the timeout. */
+ talloc_reference(web->task, web);
http_process_input(web);
+ talloc_unlink(web->task, web);
}
return;