From aebeff74fc7eaef12728b1fc15b2d42d93a7767a Mon Sep 17 00:00:00 2001 From: Olivier Houchard Date: Fri, 29 Nov 2019 16:18:51 +0100 Subject: [PATCH] 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. --- src/checks.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/checks.c b/src/checks.c index 909bd52f2..aa93bab48 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,