aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--agent/ChangeLog4
-rw-r--r--agent/query.c26
2 files changed, 27 insertions, 3 deletions
diff --git a/agent/ChangeLog b/agent/ChangeLog
index ae252474c..2fd201a8a 100644
--- a/agent/ChangeLog
+++ b/agent/ChangeLog
@@ -1,3 +1,7 @@
+2004-08-20 Werner Koch <[email protected]>
+
+ * query.c (start_pinentry): Use a timeout for the pinentry lock.
+
2004-08-18 Werner Koch <[email protected]>
* protect-tool.c (get_passphrase): Make sure that the default
diff --git a/agent/query.c b/agent/query.c
index 145aaca00..b514f6f5e 100644
--- a/agent/query.c
+++ b/agent/query.c
@@ -41,6 +41,14 @@
#define MAX_OPEN_FDS 20
#endif
+
+/* Because access to the pinentry must be serialized (it is and shall
+ be a global mutual dialog) we should better timeout further
+ requests after some time. 2 minutes seem to be a reasonable
+ time. */
+#define LOCK_TIMEOUT (1*60)
+
+
static ASSUAN_CONTEXT entry_ctx = NULL;
#ifdef USE_GNU_PTH
static pth_mutex_t entry_lock = PTH_MUTEX_INIT;
@@ -104,11 +112,23 @@ start_pinentry (CTRL ctrl)
int i;
#ifdef USE_GNU_PTH
- if (!pth_mutex_acquire (&entry_lock, 0, NULL))
+ {
+ pth_event_t evt;
+
+ evt = pth_event (PTH_EVENT_TIME, pth_timeout (LOCK_TIMEOUT, 0));
+ if (!pth_mutex_acquire (&entry_lock, 0, evt))
{
- log_error ("failed to acquire the entry lock\n");
- return gpg_error (GPG_ERR_INTERNAL);
+ if (pth_event_occurred (evt))
+ rc = gpg_error (GPG_ERR_TIMEOUT);
+ else
+ rc = gpg_error (GPG_ERR_INTERNAL);
+ pth_event_free (evt, PTH_FREE_THIS);
+ log_error (_("failed to acquire the pinentry lock: %s\n"),
+ gpg_strerror (rc));
+ return rc;
}
+ pth_event_free (evt, PTH_FREE_THIS);
+ }
#endif
if (entry_ctx)