|
|
- commit 30ba96df349ace825749a57490defeb50001a550
- Author: Emeric Brun <ebrun@haproxy.com>
- Date: Wed Oct 10 14:51:02 2018 +0200
-
- BUG/MEDIUM: Cur/CumSslConns counters not threadsafe.
-
- CurSslConns inc/dec operations are not threadsafe. The unsigned CurSslConns
- counter can wrap to a negative value. So we could notice connection rejects
- because of MaxSslConns limit artificially exceeded.
-
- CumSslConns inc operation are also not threadsafe so we could miss
- some connections and show inconsistenties values compared to CumConns.
-
- This fix should be backported to v1.8.
-
- (cherry picked from commit 7ad43e7928c9a61b40332e4d5e9a7ccc33e6b65b)
- Signed-off-by: Willy Tarreau <w@1wt.eu>
-
- diff --git a/src/ssl_sock.c b/src/ssl_sock.c
- index 2da0df68..6eed8022 100644
- --- a/src/ssl_sock.c
- +++ b/src/ssl_sock.c
- @@ -491,7 +491,7 @@ static void ssl_async_fd_free(int fd)
-
- /* Now we can safely call SSL_free, no more pending job in engines */
- SSL_free(ssl);
- - sslconns--;
- + HA_ATOMIC_SUB(&sslconns, 1);
- HA_ATOMIC_SUB(&jobs, 1);
- }
- /*
- @@ -5011,8 +5011,8 @@ static int ssl_sock_init(struct connection *conn)
- /* leave init state and start handshake */
- conn->flags |= CO_FL_SSL_WAIT_HS | CO_FL_WAIT_L6_CONN;
-
- - sslconns++;
- - totalsslconns++;
- + HA_ATOMIC_ADD(&sslconns, 1);
- + HA_ATOMIC_ADD(&totalsslconns, 1);
- return 0;
- }
- else if (objt_listener(conn->target)) {
- @@ -5062,8 +5062,8 @@ static int ssl_sock_init(struct connection *conn)
- conn->flags |= CO_FL_EARLY_SSL_HS;
- #endif
-
- - sslconns++;
- - totalsslconns++;
- + HA_ATOMIC_ADD(&sslconns, 1);
- + HA_ATOMIC_ADD(&totalsslconns, 1);
- return 0;
- }
- /* don't know how to handle such a target */
- @@ -5713,7 +5713,7 @@ static void ssl_sock_close(struct connection *conn) {
- #endif
- SSL_free(conn->xprt_ctx);
- conn->xprt_ctx = NULL;
- - sslconns--;
- + HA_ATOMIC_SUB(&sslconns, 1);
- }
- }
-
|