From 9683e9a05f4bdbc5d914d72b4a42bd5b0243fb3a Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Wed, 3 Oct 2012 21:17:23 +0200 Subject: [PATCH] MEDIUM: session: register a data->wake callback to process errors The connection layer will soon call ->wake() only when errors happen, and not ->init(). So make the session layer use this callback to detect errors and abort connections. --- src/session.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/session.c b/src/session.c index a32ec6b09d..b5dfd2bb92 100644 --- a/src/session.c +++ b/src/session.c @@ -51,6 +51,7 @@ struct pool_head *pool2_session; struct list sessions; static int conn_session_complete(struct connection *conn); +static int conn_session_update(struct connection *conn); static struct task *expire_mini_session(struct task *t); int session_complete(struct session *s); @@ -58,7 +59,7 @@ int session_complete(struct session *s); struct data_cb sess_conn_cb = { .recv = NULL, .send = NULL, - .wake = NULL, + .wake = conn_session_update, .init = conn_session_complete, }; @@ -281,6 +282,18 @@ static int conn_session_complete(struct connection *conn) return -1; } +/* Update an embryonic session status. The connection is killed in case of + * error, and <0 will be returned. Otherwise it does nothing. + */ +static int conn_session_update(struct connection *conn) +{ + if (conn->flags & CO_FL_ERROR) { + kill_mini_session(conn->owner); + return -1; + } + return 0; +} + /* Manages embryonic sessions timeout. It is only called when the timeout * strikes and performs the required cleanup. */ -- 2.39.5