From 4e8a88e7632b1f1d2b31ae738a159802549882c3 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Thu, 9 Jan 2014 19:14:09 +0100 Subject: Allow using gpgrt_lock_init on an unitialized variable. * src/posix-lock.c (gpgrt_lock_init): Detect unitialized lock var. * src/w32-lock.c (gpgrt_lock_init): Ditto. -- gpgrt_lock_init may be used for dynamically allocated locks. For example gpgrt_lock_t *lock = xcalloc (1, sizeof *lock); gpgrt_lock_init (lock); gpgrt_lock_lock (lock); foo (); gpgrt_lock_unlock (lock); gpgrt_lock_destroy (lock); free (lock); This patch actually allows for this. Signed-off-by: Werner Koch --- src/w32-lock.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to 'src/w32-lock.c') diff --git a/src/w32-lock.c b/src/w32-lock.c index 0ad9409..56a0ed5 100644 --- a/src/w32-lock.c +++ b/src/w32-lock.c @@ -52,10 +52,24 @@ get_lock_object (gpgrt_lock_t *lockhd) gpg_err_code_t gpgrt_lock_init (gpgrt_lock_t *lockhd) { - _gpgrt_lock_t *lock = get_lock_object (lockhd); + _gpgrt_lock_t *lock = (_gpgrt_lock_t*)lockhd; + + /* If VERS is zero we assume that no static initialization has been + done, so we setup our ABI version right here. The caller might + have called us to test whether lock support is at all available. */ + if (!lock->vers) + { + if (sizeof (gpgrt_lock_t) < sizeof (_gpgrt_lock_t)) + abort (); + lock->vers = LOCK_ABI_VERSION; + } + else /* Run the usual check. */ + { + lock = get_lock_object (lockhd); + if (sizeof (gpgrt_lock_t) < sizeof (_gpgrt_lock_t)) + abort (); + } - if (sizeof (gpgrt_lock_t) < sizeof (_gpgrt_lock_t)) - abort (); InitializeCriticalSection (&lock->csec); lock->initdone = 1; } -- cgit v1.2.3