From: Willy Tarreau Date: Thu, 6 Sep 2012 12:12:03 +0000 (+0200) Subject: MEDIUM: connection: improve error handling around the data layer X-Git-Tag: v1.5-dev12~14 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=58363cf1931eff0d361c2d357c4d1bf379b4324e;p=thirdparty%2Fhaproxy.git 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). --- diff --git a/src/connection.c b/src/connection.c index 90283fc5e3..8966bf70f6 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))