diff options
author | NIIBE Yutaka <[email protected]> | 2024-06-11 06:21:19 +0000 |
---|---|---|
committer | NIIBE Yutaka <[email protected]> | 2024-06-11 06:21:19 +0000 |
commit | 563bfbb0be4ebbc85bc56426541f666839e6aa13 (patch) | |
tree | e7d1da14fabefd243e7eb6ceabc3d054bfc275c8 /agent | |
parent | agent: Silence debug output from the PIN caching. (diff) | |
download | gnupg-563bfbb0be4ebbc85bc56426541f666839e6aa13.tar.gz gnupg-563bfbb0be4ebbc85bc56426541f666839e6aa13.zip |
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 <[email protected]>
Diffstat (limited to 'agent')
-rw-r--r-- | agent/call-daemon.c | 10 |
1 files 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; } |