From 5c8a2d720464e4a7d58bca159c9f73f7a2f51b03 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 8 Jan 2017 18:12:21 +0000 Subject: [PATCH] gpg-agent connection count: Introduce locking This variable is incremented and decremented by each individual thread. It must therefore be protected by a lock. Rename it to prove we have found all the references. Signed-off-by: Ian Jackson --- agent/gpg-agent.c | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c index 8ca6d92..1f92661 100644 --- a/agent/gpg-agent.c +++ b/agent/gpg-agent.c @@ -386,7 +386,8 @@ static pid_t parent_pid = (pid_t)(-1); static pid_t main_thread_pid = (pid_t)(-1); /* Number of active connections. */ -static int active_connections; +static int active_connections_value; +static npth_mutex_t active_connections_lock; /* This object is used to dispatch progress messages from Libgcrypt to * the right thread. Given that we will have at max only a few dozen @@ -1988,18 +1989,47 @@ get_agent_ssh_socket_name (void) } +static void +lock_active_connections (void) +{ + int err; + + err = npth_mutex_lock (&active_connections_lock); + if (err) + log_fatal ("failed to acquire active connection count mutex: %s\n", + strerror (err)); +} + +static void +unlock_active_connections (void) +{ + int err; + + err = npth_mutex_unlock (&active_connections_lock); + if (err) + log_fatal ("failed to release active connection count mutex: %s\n", + strerror (err)); +} + /* Return the number of active connections. */ int get_agent_active_connection_count (void) { - return active_connections; + int value; + + lock_active_connections(); + value = active_connections_value; + unlock_active_connections(); + return value; } /* Increment/decrement the number of active connections. */ static void adjust_agent_active_connections (int delta) { - active_connections += delta; + lock_active_connections(); + active_connections_value += delta; + unlock_active_connections(); } @@ -2780,6 +2810,10 @@ handle_connections (gnupg_fd_t listen_fd, { { CHECK_OWN_SOCKET_INTERVAL, 0 }, check_own_socket } }; + ret = npth_mutex_init (&active_connections_lock, NULL); + if (ret) + log_fatal ("error allocating active connections mutex: %s\n", + strerror (ret)); ret = npth_attr_init(&tattr); if (ret) -- 2.30.2