From 563bfbb0be4ebbc85bc56426541f666839e6aa13 Mon Sep 17 00:00:00 2001 From: NIIBE Yutaka Date: Tue, 11 Jun 2024 15:21:19 +0900 Subject: [PATCH] agent: Fix a race condition which results accessing finished scd. * agent/call-daemon.c (daemon_start): Decision of connection/reuse of CTX and assignment to ->ctx should be done with the lock. -- When scdaemon is exiting and agent tries to spawn/connect/reconnect, there is a race condition between detecting finish of scd and spawn/connect/reconnect. Signed-off-by: NIIBE Yutaka --- agent/call-daemon.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/agent/call-daemon.c b/agent/call-daemon.c index 806ef5dc1..32805104f 100644 --- a/agent/call-daemon.c +++ b/agent/call-daemon.c @@ -469,13 +469,12 @@ daemon_start (enum daemon_type type, ctrl_t ctrl) } leave: - rc = npth_mutex_unlock (&start_daemon_lock); - if (rc) - log_error ("failed to release the start_daemon lock: %s\n", strerror (rc)); - xfree (abs_homedir); if (err) { + rc = npth_mutex_unlock (&start_daemon_lock); + if (rc) + log_error ("failed to release the start_daemon lock: %s\n", strerror (rc)); daemon_unlock (type, ctrl, err); if (ctx) assuan_release (ctx); @@ -484,6 +483,9 @@ daemon_start (enum daemon_type type, ctrl_t ctrl) { ctrl->d_local[type]->ctx = ctx; ctrl->d_local[type]->invalid = 0; + rc = npth_mutex_unlock (&start_daemon_lock); + if (rc) + log_error ("failed to release the start_daemon lock: %s\n", strerror (rc)); } return err; }