summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am3
-rw-r--r--src/ath.c333
-rw-r--r--src/ath.h93
-rw-r--r--src/fips.c21
-rw-r--r--src/global.c19
-rw-r--r--src/secmem.c14
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 */
diff --git a/src/fips.c b/src/fips.c
index 3ab33f93..c90e4b69 100644
--- a/src/fips.c
+++ b/src/fips.c
@@ -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;
}