From: Olivier Houchard Date: Fri, 29 Nov 2019 15:18:51 +0000 (+0100) Subject: BUG/MEDIUM: checks: Make sure we set the task affinity just before connecting. X-Git-Tag: v2.2-dev1~209 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=aebeff74fc7eaef12728b1fc15b2d42d93a7767a;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: checks: Make sure we set the task affinity just before connecting. In process_chk_conn(), make sure we set the task affinity to the current thread as soon as we're attempting a connection (and reset the affinity to "any thread" if we detect a failure). We used to only set the task affinity if connect_conn_chk() returned SF_ERR_NONE, however for TCP checks, SF_ERR_UP is returned, so for those checks, the task could still run on any thread, and this could lead to a race condition where the connection runs on one thread, while the task runs on another one, which could create random memory corruption and/or crashes. This may fix github issue #369. This should be backported to 2.1, 2.0 and 1.9. --- diff --git a/src/checks.c b/src/checks.c index 909bd52f22..aa93bab48f 100644 --- a/src/checks.c +++ b/src/checks.c @@ -2245,6 +2245,7 @@ static struct task *process_chk_conn(struct task *t, void *context, unsigned sho b_reset(&check->bi); b_reset(&check->bo); + task_set_affinity(t, tid_bit); ret = connect_conn_chk(t); cs = check->cs; conn = cs_conn(cs); @@ -2276,7 +2277,6 @@ static struct task *process_chk_conn(struct task *t, void *context, unsigned sho __event_srv_chk_r(cs); } - task_set_affinity(t, tid_bit); goto reschedule; case SF_ERR_SRVTO: /* ETIMEDOUT */ @@ -2298,6 +2298,7 @@ static struct task *process_chk_conn(struct task *t, void *context, unsigned sho } /* here, we have seen a synchronous error, no fd was allocated */ + task_set_affinity(t, MAX_THREADS_MASK); if (cs) { if (check->wait_list.events) cs->conn->xprt->unsubscribe(cs->conn,