diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 3 | ||||
-rw-r--r-- | src/ath.c | 333 | ||||
-rw-r--r-- | src/ath.h | 93 | ||||
-rw-r--r-- | src/fips.c | 21 | ||||
-rw-r--r-- | src/global.c | 19 | ||||
-rw-r--r-- | src/secmem.c | 14 |
6 files changed, 20 insertions, 463 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index c0202395..b764852b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -61,8 +61,7 @@ libgcrypt_la_SOURCES = \ stdmem.c stdmem.h secmem.c secmem.h \ mpi.h missing-string.c fips.c \ hmac256.c hmac256.h context.c context.h \ - ec-context.h \ - ath.h ath.c + ec-context.h EXTRA_libgcrypt_la_SOURCES = hwf-x86.c hwf-arm.c gcrypt_hwf_modules = @GCRYPT_HWF_MODULES@ diff --git a/src/ath.c b/src/ath.c deleted file mode 100644 index 7a7035d4..00000000 --- a/src/ath.c +++ /dev/null @@ -1,333 +0,0 @@ -/* ath.c - A Thread-safeness library. - * Copyright (C) 2002, 2003, 2004, 2011 Free Software Foundation, Inc. - * - * This file is part of Libgcrypt. - * - * Libgcrypt is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser general Public License as - * published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * Libgcrypt is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <assert.h> -#include <stdlib.h> -#include <unistd.h> -#include <errno.h> -#if USE_POSIX_THREADS_WEAK -# include <pthread.h> -#endif - -#include "ath.h" - - - -/* On an ELF system it is easy to use pthreads using weak references. - Take care not to test the address of a weak referenced function we - actually use; some GCC versions have a bug were &foo != NULL is - always evaluated to true in PIC mode. USING_PTHREAD_AS_DEFAULT is - used by ath_install to detect the default usage of pthread. */ -#if USE_POSIX_THREADS_WEAK -# pragma weak pthread_cancel -# pragma weak pthread_mutex_init -# pragma weak pthread_mutex_lock -# pragma weak pthread_mutex_unlock -# pragma weak pthread_mutex_destroy -#endif - -/* For the dummy interface. The MUTEX_NOTINIT value is used to check - that a mutex has been initialized. */ -#define MUTEX_NOTINIT ((ath_mutex_t) 0) -#define MUTEX_UNLOCKED ((ath_mutex_t) 1) -#define MUTEX_LOCKED ((ath_mutex_t) 2) -#define MUTEX_DESTROYED ((ath_mutex_t) 3) - - -/* Return the thread type from the option field. */ -#define GET_OPTION(a) ((a) & 0xff) - - - -enum ath_thread_model { - ath_model_undefined = 0, - ath_model_none, /* No thread support. */ - ath_model_pthreads_weak, /* POSIX threads using weak symbols. */ - ath_model_pthreads, /* POSIX threads directly linked. */ - ath_model_w32 /* Microsoft Windows threads. */ -}; - - -/* The thread model in use. */ -static enum ath_thread_model thread_model; - - -/* Initialize the ath subsystem. This is called as part of the - Libgcrypt initialization. It's purpose is to initialize the - locking system. It returns 0 on sucess or an ERRNO value on error. - In the latter case it is not defined whether ERRNO was changed. - - Note: This should be called as early as possible because it is not - always possible to detect the thread model to use while already - running multi threaded. */ -int -ath_init (void) -{ - int err = 0; - - if (thread_model) - return 0; /* Already initialized - no error. */ - - if (0) - ; -#if USE_POSIX_THREADS_WEAK - else if (pthread_cancel) - { - thread_model = ath_model_pthreads_weak; - } -#endif - else - { - /* Assume a single threaded application. */ - thread_model = ath_model_none; - } - - return err; -} - - -/* Return the used thread model as string for display purposes an if - R_MODEL is not null store its internal number at R_MODEL. */ -const char * -ath_get_model (int *r_model) -{ - if (r_model) - *r_model = thread_model; - switch (thread_model) - { - case ath_model_undefined: return "undefined"; - case ath_model_none: return "none"; - case ath_model_pthreads_weak: return "pthread(weak)"; - case ath_model_pthreads: return "pthread"; - case ath_model_w32: return "w32"; - default: return "?"; - } -} - - -/* This function was used in old Libgcrypt versions (via - GCRYCTL_SET_THREAD_CBS) to register the thread callback functions. - It is not anymore required. However to allow existing code to - continue to work, we keep this function and check that no user - defined callbacks are used and that the requested thread system - matches the one Libgcrypt is using. */ -gpg_err_code_t -ath_install (struct ath_ops *ath_ops) -{ - gpg_err_code_t rc; - unsigned int thread_option; - - /* Fist call ath_init so that we know our thread model. */ - rc = ath_init (); - if (rc) - return rc; - - /* Check if the requested thread option is compatible to the - thread option we are already committed to. */ - thread_option = ath_ops? GET_OPTION (ath_ops->option) : 0; - - /* Return an error if the requested thread model does not match the - configured one. */ - if (0) - ; -#if USE_POSIX_THREADS_WEAK - else if (thread_model == ath_model_pthreads_weak) - { - if (thread_option == ATH_THREAD_OPTION_PTHREAD) - return 0; /* Okay - compatible. */ - if (thread_option == ATH_THREAD_OPTION_PTH) - return 0; /* Okay - compatible. */ - } -#endif /*USE_POSIX_THREADS_WEAK*/ - else if (thread_option == ATH_THREAD_OPTION_PTH) - { - if (thread_model == ath_model_none) - return 0; /* Okay - compatible. */ - } - else if (thread_option == ATH_THREAD_OPTION_DEFAULT) - return 0; /* No thread support requested. */ - - return GPG_ERR_NOT_SUPPORTED; -} - - -/* Initialize a new mutex. This function returns 0 on success or an - system error code (i.e. an ERRNO value). ERRNO may or may not be - changed on error. */ -int -ath_mutex_init (ath_mutex_t *lock) -{ - int err; - - switch (thread_model) - { - case ath_model_none: - *lock = MUTEX_UNLOCKED; - err = 0; - break; - -#if USE_POSIX_THREADS_WEAK - case ath_model_pthreads_weak: - { - pthread_mutex_t *plck; - - plck = malloc (sizeof *plck); - if (!plck) - err = errno? errno : ENOMEM; - else - { - err = pthread_mutex_init (plck, NULL); - if (err) - free (plck); - else - *lock = (void*)plck; - } - } - break; -#endif /*USE_POSIX_THREADS_WEAK*/ - - default: - err = EINVAL; - break; - } - - return err; -} - - -/* Destroy a mutex. This function is a NOP if LOCK is NULL. If the - mutex is still locked it can't be destroyed and the function - returns EBUSY. ERRNO may or may not be changed on error. */ -int -ath_mutex_destroy (ath_mutex_t *lock) -{ - int err; - - if (!*lock) - return 0; - - switch (thread_model) - { - case ath_model_none: - if (*lock != MUTEX_UNLOCKED) - err = EBUSY; - else - { - *lock = MUTEX_DESTROYED; - err = 0; - } - break; - -#if USE_POSIX_THREADS_WEAK - case ath_model_pthreads_weak: - { - pthread_mutex_t *plck = (pthread_mutex_t*) (*lock); - - err = pthread_mutex_destroy (plck); - if (!err) - { - free (plck); - lock = NULL; - } - } - break; -#endif /*USE_POSIX_THREADS_WEAK*/ - - default: - err = EINVAL; - break; - } - - return err; -} - - -/* Lock the mutex LOCK. On success the function returns 0; on error - an error code. ERRNO may or may not be changed on error. */ -int -ath_mutex_lock (ath_mutex_t *lock) -{ - int err; - - switch (thread_model) - { - case ath_model_none: - if (*lock == MUTEX_NOTINIT) - err = EINVAL; - else if (*lock == MUTEX_UNLOCKED) - { - *lock = MUTEX_LOCKED; - err = 0; - } - else - err = EDEADLK; - break; - -#if USE_POSIX_THREADS_WEAK - case ath_model_pthreads_weak: - err = pthread_mutex_lock ((pthread_mutex_t*)(*lock)); - break; -#endif /*USE_POSIX_THREADS_WEAK*/ - - default: - err = EINVAL; - break; - } - - return err; -} - -/* Unlock the mutex LOCK. On success the function returns 0; on error - an error code. ERRNO may or may not be changed on error. */ -int -ath_mutex_unlock (ath_mutex_t *lock) -{ - int err; - - switch (thread_model) - { - case ath_model_none: - if (*lock == MUTEX_NOTINIT) - err = EINVAL; - else if (*lock == MUTEX_LOCKED) - { - *lock = MUTEX_UNLOCKED; - err = 0; - } - else - err = EPERM; - break; - -#if USE_POSIX_THREADS_WEAK - case ath_model_pthreads_weak: - err = pthread_mutex_unlock ((pthread_mutex_t*)(*lock)); - break; -#endif /*USE_POSIX_THREADS_WEAK*/ - - default: - err = EINVAL; - break; - } - - return err; -} diff --git a/src/ath.h b/src/ath.h deleted file mode 100644 index a132e0b7..00000000 --- a/src/ath.h +++ /dev/null @@ -1,93 +0,0 @@ -/* ath.h - Thread-safeness library. - * Copyright (C) 2002, 2003, 2004, 2011 Free Software Foundation, Inc. - * - * This file is part of Libgcrypt. - * - * Libgcrypt is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser general Public License as - * published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * Libgcrypt is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef ATH_H -#define ATH_H - -#include <config.h> - -#ifdef _WIN32 -# include <winsock2.h> -# include <windows.h> -#else /* !_WIN32 */ -# ifdef HAVE_SYS_SELECT_H -# include <sys/select.h> -# else -# include <sys/time.h> -# endif -# include <sys/types.h> -# ifdef HAVE_SYS_MSG_H -# include <sys/msg.h> /* (e.g. for zOS) */ -# endif -# include <sys/socket.h> -#endif /* !_WIN32 */ -#include <gpg-error.h> - - - -/* Define _ATH_EXT_SYM_PREFIX if you want to give all external symbols - a prefix. */ -#define _ATH_EXT_SYM_PREFIX _gcry_ - -#ifdef _ATH_EXT_SYM_PREFIX -#define _ATH_PREFIX1(x,y) x ## y -#define _ATH_PREFIX2(x,y) _ATH_PREFIX1(x,y) -#define _ATH_PREFIX(x) _ATH_PREFIX2(_ATH_EXT_SYM_PREFIX,x) -#define ath_install _ATH_PREFIX(ath_install) -#define ath_init _ATH_PREFIX(ath_init) -#define ath_get_model _ATH_PREFIX(ath_get_model) -#define ath_mutex_init _ATH_PREFIX(ath_mutex_init) -#define ath_mutex_destroy _ATH_PREFIX(ath_mutex_destroy) -#define ath_mutex_lock _ATH_PREFIX(ath_mutex_lock) -#define ath_mutex_unlock _ATH_PREFIX(ath_mutex_unlock) -#endif - - -enum ath_thread_option - { - ATH_THREAD_OPTION_DEFAULT = 0, - ATH_THREAD_OPTION_USER = 1, - ATH_THREAD_OPTION_PTH = 2, - ATH_THREAD_OPTION_PTHREAD = 3 - }; - -struct ath_ops -{ - /* The OPTION field encodes the thread model and the version number - of this structure. - Bits 7 - 0 are used for the thread model - Bits 15 - 8 are used for the version number. - */ - unsigned int option; - -}; - -gpg_err_code_t ath_install (struct ath_ops *ath_ops); -int ath_init (void); -const char *ath_get_model (int *r_model); - -/* Functions for mutual exclusion. */ -typedef void *ath_mutex_t; - -int ath_mutex_init (ath_mutex_t *mutex); -int ath_mutex_destroy (ath_mutex_t *mutex); -int ath_mutex_lock (ath_mutex_t *mutex); -int ath_mutex_unlock (ath_mutex_t *mutex); - -#endif /* ATH_H */ @@ -31,7 +31,6 @@ #endif /*HAVE_SYSLOG*/ #include "g10lib.h" -#include "ath.h" #include "cipher-proto.h" #include "hmac256.h" @@ -69,7 +68,7 @@ static int enforced_fips_mode; static int inactive_fips_mode; /* This is the lock we use to protect the FSM. */ -static ath_mutex_t fsm_lock; +GPGRT_LOCK_DEFINE (fsm_lock); /* The current state of the FSM. The whole state machinery is only used while in fips mode. Change this only while holding fsm_lock. */ @@ -181,18 +180,18 @@ _gcry_initialize_fips_mode (int force) FILE *fp; /* Intitialize the lock to protect the FSM. */ - err = ath_mutex_init (&fsm_lock); + err = gpgrt_lock_init (&fsm_lock); if (err) { /* If that fails we can't do anything but abort the process. We need to use log_info so that the FSM won't get involved. */ log_info ("FATAL: failed to create the FSM lock in libgcrypt: %s\n", - strerror (err)); + gpg_strerror (err)); #ifdef HAVE_SYSLOG syslog (LOG_USER|LOG_ERR, "Libgcrypt error: " "creating FSM lock failed: %s - abort", - strerror (err)); + gpg_strerror (err)); #endif /*HAVE_SYSLOG*/ abort (); } @@ -222,15 +221,15 @@ lock_fsm (void) { gpg_error_t err; - err = ath_mutex_lock (&fsm_lock); + err = gpgrt_lock_lock (&fsm_lock); if (err) { log_info ("FATAL: failed to acquire the FSM lock in libgrypt: %s\n", - strerror (err)); + gpg_strerror (err)); #ifdef HAVE_SYSLOG syslog (LOG_USER|LOG_ERR, "Libgcrypt error: " "acquiring FSM lock failed: %s - abort", - strerror (err)); + gpg_strerror (err)); #endif /*HAVE_SYSLOG*/ abort (); } @@ -241,15 +240,15 @@ unlock_fsm (void) { gpg_error_t err; - err = ath_mutex_unlock (&fsm_lock); + err = gpgrt_lock_unlock (&fsm_lock); if (err) { log_info ("FATAL: failed to release the FSM lock in libgrypt: %s\n", - strerror (err)); + gpg_strerror (err)); #ifdef HAVE_SYSLOG syslog (LOG_USER|LOG_ERR, "Libgcrypt error: " "releasing FSM lock failed: %s - abort", - strerror (err)); + gpg_strerror (err)); #endif /*HAVE_SYSLOG*/ abort (); } diff --git a/src/global.c b/src/global.c index 9af499e2..b2b1de6e 100644 --- a/src/global.c +++ b/src/global.c @@ -2,7 +2,7 @@ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 * 2004, 2005, 2006, 2008, 2011, * 2012 Free Software Foundation, Inc. - * Copyright (C) 2013 g10 Code GmbH + * Copyright (C) 2013, 2014 g10 Code GmbH * * This file is part of Libgcrypt. * @@ -38,7 +38,7 @@ #include "cipher.h" #include "stdmem.h" /* our own memory allocator */ #include "secmem.h" /* our own secmem allocator */ -#include "ath.h" + @@ -86,14 +86,6 @@ global_init (void) /* Tell the random module that we have seen an init call. */ _gcry_set_preferred_rng_type (0); - /* Initialize our portable thread/mutex wrapper. */ - err = ath_init (); - if (err) - { - err = gpg_error_from_errno (err); - goto fail; - } - /* See whether the system is in FIPS mode. This needs to come as early as possible but after ATH has been initialized. */ _gcry_initialize_fips_mode (force_fips_mode); @@ -304,7 +296,6 @@ print_config ( int (*fnc)(FILE *fp, const char *format, ...), FILE *fp) #endif ":\n"); fnc (fp, "mpi-asm:%s:\n", _gcry_mpi_get_hw_config ()); - fnc (fp, "threads:%s:\n", ath_get_model (NULL)); hwfeatures = _gcry_get_hw_features (); fnc (fp, "hwflist:"); for (i=0; (s = _gcry_enum_hw_features (i, &afeature)); i++) @@ -476,10 +467,10 @@ _gcry_vcontrol (enum gcry_ctl_cmds cmd, va_list arg_ptr) break; case GCRYCTL_SET_THREAD_CBS: + /* This is now a dummy call. We used to install our own thread + library here. */ _gcry_set_preferred_rng_type (0); - rc = ath_install (va_arg (arg_ptr, void *)); - if (!rc) - global_init (); + global_init (); break; case GCRYCTL_FAST_POLL: diff --git a/src/secmem.c b/src/secmem.c index 2bf7d8c6..cfea9213 100644 --- a/src/secmem.c +++ b/src/secmem.c @@ -37,7 +37,6 @@ #endif #endif -#include "ath.h" #include "g10lib.h" #include "secmem.h" @@ -86,11 +85,11 @@ static int no_priv_drop; static unsigned int cur_alloced, cur_blocks; /* Lock protecting accesses to the memory pool. */ -static ath_mutex_t secmem_lock; +GPGRT_LOCK_DEFINE (secmem_lock); /* Convenient macros. */ -#define SECMEM_LOCK ath_mutex_lock (&secmem_lock) -#define SECMEM_UNLOCK ath_mutex_unlock (&secmem_lock) +#define SECMEM_LOCK gpgrt_lock_lock (&secmem_lock) +#define SECMEM_UNLOCK gpgrt_lock_unlock (&secmem_lock) /* The size of the memblock structure; this does not include the memory that is available to the user. */ @@ -536,12 +535,7 @@ _gcry_secmem_init (size_t n) gcry_err_code_t _gcry_secmem_module_init () { - int err; - - err = ath_mutex_init (&secmem_lock); - if (err) - log_fatal ("could not allocate secmem lock\n"); - + /* No anymore needed. */ return 0; } |