From 58363cf1931eff0d361c2d357c4d1bf379b4324e Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Thu, 6 Sep 2012 14:12:03 +0200 Subject: [PATCH] MEDIUM: connection: improve error handling around the data layer Better avoid calling the data functions upon error or handshake than having to put conditions everywhere, which are too easy to forget (one check for CO_FL_ERROR was missing, but this was harmless). --- src/connection.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/connection.c b/src/connection.c index 90283fc5e..8966bf70f 100644 --- a/src/connection.c +++ b/src/connection.c @@ -75,21 +75,13 @@ int conn_fd_handler(int fd) conn_session_complete(conn, CO_FL_INIT_SESS) < 0) return 0; + /* The data transfer starts here and stops on error and handshakes */ if ((fdtab[fd].ev & (FD_POLL_IN | FD_POLL_HUP | FD_POLL_ERR)) && - !(conn->flags & (CO_FL_WAIT_RD|CO_FL_WAIT_ROOM))) + !(conn->flags & (CO_FL_WAIT_RD|CO_FL_WAIT_ROOM|CO_FL_ERROR|CO_FL_HANDSHAKE))) conn->app_cb->recv(conn); - if (unlikely(conn->flags & CO_FL_ERROR)) - goto leave; - - /* It may happen during the data phase that a handshake is - * enabled again (eg: SSL) - */ - if (unlikely(conn->flags & CO_FL_HANDSHAKE)) - goto process_handshake; - if ((fdtab[fd].ev & (FD_POLL_OUT | FD_POLL_ERR)) && - !(conn->flags & (CO_FL_WAIT_WR|CO_FL_WAIT_DATA))) + !(conn->flags & (CO_FL_WAIT_WR|CO_FL_WAIT_DATA|CO_FL_ERROR|CO_FL_HANDSHAKE))) conn->app_cb->send(conn); if (unlikely(conn->flags & CO_FL_ERROR)) -- 2.47.3