diff options
author | Werner Koch <[email protected]> | 2014-01-09 18:14:09 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2014-01-24 15:29:33 +0000 |
commit | 4e8a88e7632b1f1d2b31ae738a159802549882c3 (patch) | |
tree | 606798aee980c1ee1f250b271177039c75d35902 | |
parent | Move version number first in the Posix lock-obj. (diff) | |
download | libgpg-error-4e8a88e7632b1f1d2b31ae738a159802549882c3.tar.gz libgpg-error-4e8a88e7632b1f1d2b31ae738a159802549882c3.zip |
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 <[email protected]>
-rw-r--r-- | src/gpg-error.h.in | 3 | ||||
-rw-r--r-- | src/posix-lock.c | 16 | ||||
-rw-r--r-- | src/w32-lock.c | 20 |
3 files changed, 33 insertions, 6 deletions
diff --git a/src/gpg-error.h.in b/src/gpg-error.h.in index adb796b..4bd28bf 100644 --- a/src/gpg-error.h.in +++ b/src/gpg-error.h.in @@ -291,7 +291,8 @@ gpg_error_from_syserror (void) #define GPGRT_LOCK_DEFINE(name) \ static gpgrt_lock_t name = GPGRT_LOCK_INITIALIZER - +/* NB: If GPGRT_LOCK_DEFINE is not used, zero out the lock variable + before passing it to gpgrt_lock_init. */ gpg_err_code_t gpgrt_lock_init (gpgrt_lock_t *lockhd); gpg_err_code_t gpgrt_lock_lock (gpgrt_lock_t *lockhd); gpg_err_code_t gpgrt_lock_unlock (gpgrt_lock_t *lockhd); diff --git a/src/posix-lock.c b/src/posix-lock.c index 363cc09..5b0cab5 100644 --- a/src/posix-lock.c +++ b/src/posix-lock.c @@ -116,9 +116,21 @@ 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; int rc; + /* 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 USE_POSIX_THREADS if (use_pthread_p()) { @@ -198,7 +210,7 @@ gpgrt_lock_destroy (gpgrt_lock_t *lockhd) rc = gpg_err_code_from_errno (rc); else { - /* Re-init the the mutex so that it can be re-used. */ + /* Re-init the mutex so that it can be re-used. */ gpgrt_lock_t tmp = GPGRT_LOCK_INITIALIZER; memcpy (lockhd, &tmp, sizeof tmp); } 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; } |