1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-12-22 10:19:57 +01:00

(start_pinentry): Use a timeout for the pinentry lock.

This commit is contained in:
Werner Koch 2004-08-20 13:03:32 +00:00
parent 6c3677c296
commit 0ded031237
2 changed files with 27 additions and 3 deletions

View 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> 2004-08-18 Werner Koch <wk@g10code.de>
* protect-tool.c (get_passphrase): Make sure that the default * protect-tool.c (get_passphrase): Make sure that the default

View File

@ -41,6 +41,14 @@
#define MAX_OPEN_FDS 20 #define MAX_OPEN_FDS 20
#endif #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; static ASSUAN_CONTEXT entry_ctx = NULL;
#ifdef USE_GNU_PTH #ifdef USE_GNU_PTH
static pth_mutex_t entry_lock = PTH_MUTEX_INIT; static pth_mutex_t entry_lock = PTH_MUTEX_INIT;
@ -104,11 +112,23 @@ start_pinentry (CTRL ctrl)
int i; int i;
#ifdef USE_GNU_PTH #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"); if (pth_event_occurred (evt))
return gpg_error (GPG_ERR_INTERNAL); 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 #endif
if (entry_ctx) if (entry_ctx)