(start_pinentry): Use a timeout for the pinentry lock.
authorWerner Koch <wk@gnupg.org>
Fri, 20 Aug 2004 13:03:32 +0000 (13:03 +0000)
committerWerner Koch <wk@gnupg.org>
Fri, 20 Aug 2004 13:03:32 +0000 (13:03 +0000)
agent/ChangeLog
agent/query.c

index ae25247..2fd201a 100644 (file)
@@ -1,3 +1,7 @@
+2004-08-20  Werner Koch  <wk@g10code.de>
+
+       * query.c (start_pinentry): Use a timeout for the pinentry lock.
+
 2004-08-18  Werner Koch  <wk@g10code.de>
 
        * protect-tool.c (get_passphrase): Make sure that the default
index 145aaca..b514f6f 100644 (file)
 #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)