]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: checks: Destroy the conn-stream before the session
authorChristopher Faulet <cfaulet@haproxy.com>
Mon, 27 Apr 2020 13:59:22 +0000 (15:59 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Mon, 27 Apr 2020 13:59:26 +0000 (15:59 +0200)
At the end of a tcp-check based health check, if there is still a connection
attached to the check, it must be closed. But it must be done before releasing
the session, because the session may still be referenced by the mux. For
instance, an h2 stream may still have a reference on the session.

No need to backport.

src/checks.c

index 414c39e42181678d247dfd33773114f7ea8fef44..d17302a969fe758a124a6db7a167dcb676a4b61d 100644 (file)
@@ -2350,7 +2350,7 @@ static int tcpcheck_main(struct check *check)
 
        /* here, we know that the check is complete or that it failed */
        if (check->result != CHK_RES_UNKNOWN)
-               goto out_end_tcpcheck;
+               goto out;
 
        /* 1- check for connection error, if any */
        if ((conn && conn->flags & CO_FL_ERROR) || (cs && cs->flags & CS_FL_ERROR))
@@ -2526,13 +2526,6 @@ static int tcpcheck_main(struct check *check)
        if ((conn && conn->flags & CO_FL_ERROR) || (cs && cs->flags & CS_FL_ERROR))
                chk_report_conn_err(check, errno, 0);
 
-       /* cleanup before leaving */
-       check->current_step = NULL;
-       if (check->sess != NULL) {
-               vars_prune(&check->vars, check->sess, NULL);
-               session_free(check->sess);
-               check->sess = NULL;
-       }
   out:
        return retcode;
 }
@@ -3316,10 +3309,6 @@ static struct task *process_chk_conn(struct task *t, void *context, unsigned sho
                /* check complete or aborted */
 
                check->current_step = NULL;
-               if (check->sess != NULL) {
-                       session_free(check->sess);
-                       check->sess = NULL;
-               }
 
                if (conn && conn->xprt) {
                        /* The check was aborted and the connection was not yet closed.
@@ -3344,6 +3333,12 @@ static struct task *process_chk_conn(struct task *t, void *context, unsigned sho
                        conn = NULL;
                }
 
+               if (check->sess != NULL) {
+                       vars_prune(&check->vars, check->sess, NULL);
+                       session_free(check->sess);
+                       check->sess = NULL;
+               }
+
                if (check->server) {
                        if (check->result == CHK_RES_FAILED) {
                                /* a failure or timeout detected */