From: Nikos Mavrogiannopoulos Date: Tue, 29 Jun 2010 15:42:47 +0000 (+0200) Subject: Moved locking code to special file. X-Git-Tag: gnutls_2_11_3~135 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=10a6640bfed1d64e59ca29ed27937d21758d3bc5;p=thirdparty%2Fgnutls.git Moved locking code to special file. --- diff --git a/lib/Makefile.am b/lib/Makefile.am index 8eb2d2d459..7034b53904 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -80,7 +80,7 @@ COBJECTS = gnutls_record.c gnutls_compress.c debug.c gnutls_cipher.c \ auth_dh_common.c gnutls_helper.c gnutls_supplemental.c \ crypto.c random.c ext_signature.c cryptodev.c \ crypto-api.c ext_safe_renegotiation.c gnutls_privkey.c \ - pkcs11.c pkcs11_privkey.c gnutls_pubkey.c pkcs11_write.c + pkcs11.c pkcs11_privkey.c gnutls_pubkey.c pkcs11_write.c locks.c if ENABLE_NETTLE @@ -104,7 +104,7 @@ HFILES = debug.h gnutls_compress.h gnutls_cipher.h gnutls_buffers.h \ gnutls_helper.h auth_psk.h auth_psk_passwd.h \ gnutls_supplemental.h crypto.h random.h \ ext_session_ticket.h ext_signature.h gnutls_cryptodev.h \ - ext_safe_renegotiation.h + ext_safe_renegotiation.h locks.h if ENABLE_LOCAL_PAKCHOIS COBJECTS+=pakchois/pakchois.c pakchois/errors.c diff --git a/lib/gnutls_global.c b/lib/gnutls_global.c index bdbdc642bd..1f5dc9ddb7 100644 --- a/lib/gnutls_global.c +++ b/lib/gnutls_global.c @@ -37,6 +37,7 @@ #include /* for _gnutls_ext_init */ #include +#include #include "sockets.h" #include "gettext.h" @@ -54,139 +55,6 @@ ASN1_TYPE _gnutls_gnutls_asn; gnutls_log_func _gnutls_log_func; int _gnutls_log_level = 0; /* default log level */ -#ifdef _WIN32 - -# include - -/* FIXME: win32 locks are untested */ -static int gnutls_system_mutex_init (void **priv) -{ - CRITICAL_SECTION *lock = malloc (sizeof (CRITICAL_SECTION)); - int ret; - - if (lock==NULL) - return GNUTLS_E_MEMORY_ERROR; - - InitializeCriticalSection(lock); - - *priv = lock; - - return 0; -} - -static void gnutls_system_mutex_deinit (void *priv) -{ - DeleteCriticalSection(priv); - free(priv); -} - -static int gnutls_system_mutex_lock (void *priv) -{ - EnterCriticalSection(priv); - return 0; -} - -static int gnutls_system_mutex_unlock (void *priv) -{ - LeaveCriticalSection(priv); - return 0; -} - -#else - -# ifdef HAVE_LIBPTHREAD -# include - -static int gnutls_system_mutex_init (void **priv) -{ - pthread_mutex_t *lock = malloc (sizeof (pthread_mutex_t)); - int ret; - - if (lock==NULL) - return GNUTLS_E_MEMORY_ERROR; - - ret = pthread_mutex_init (lock, NULL); - if (ret) - { - free(lock); - gnutls_assert(); - return GNUTLS_E_LOCKING_ERROR; - } - - *priv = lock; - - return 0; -} - -static void gnutls_system_mutex_deinit (void *priv) -{ - pthread_mutex_destroy(priv); - free(priv); -} - -static int gnutls_system_mutex_lock (void *priv) -{ - if (pthread_mutex_lock(priv)) - { - gnutls_assert(); - return GNUTLS_E_LOCKING_ERROR; - } - - return 0; -} - -static int gnutls_system_mutex_unlock (void *priv) -{ - if (pthread_mutex_unlock(priv)) - { - gnutls_assert(); - return GNUTLS_E_LOCKING_ERROR; - } - - return 0; -} - -# else - -#define gnutls_system_mutex_init NULL -#define gnutls_system_mutex_deinit NULL -#define gnutls_system_mutex_lock NULL -#define gnutls_mutex_unlock NULL - -# endif /* PTHREAD */ - -#endif - -mutex_init_func gnutls_mutex_init = gnutls_system_mutex_init; -mutex_deinit_func gnutls_mutex_deinit = gnutls_system_mutex_deinit; -mutex_lock_func gnutls_mutex_lock = gnutls_system_mutex_lock; -mutex_unlock_func gnutls_mutex_unlock = gnutls_system_mutex_unlock; - -/** - * gnutls_global_set_mutex: - * @init: mutex initialization function - * @deinit: mutex deinitialization function - * @lock: mutex locking function - * @unlock: mutex unlocking function - * - * With this function you are allowed to override the default mutex - * locks used in some parts of gnutls and dependent libraries. This function - * should be used if you have complete control of your program and libraries. - * Do not call this function from a library. Instead only initialize gnutls and - * the default OS mutex locks will be used. - * - * This function must be called before gnutls_global_init(). - * - **/ -void gnutls_global_set_mutex(mutex_init_func init, mutex_deinit_func deinit, - mutex_lock_func lock, mutex_unlock_func unlock) -{ - gnutls_mutex_init = init; - gnutls_mutex_deinit = deinit; - gnutls_mutex_lock = lock; - gnutls_mutex_unlock = unlock; -} - /** * gnutls_global_set_log_function: * @log_func: it's a log function @@ -274,35 +142,6 @@ gnutls_global_set_mem_functions (gnutls_alloc_function alloc_func, static int _gnutls_init = 0; -#ifndef HAVE_LIBNETTLE -static struct gcry_thread_cbs gct = { - .option = (GCRY_THREAD_OPTION_PTH | (GCRY_THREAD_OPTION_VERSION << 8)), - .init = NULL, - .select = NULL, - .waitpid = NULL, - .accept = NULL, - .connect = NULL, - .sendmsg = NULL, - .recvmsg = NULL, -}; - -static int wrap_gcry_mutex_lock(void** m) -{ - return gnutls_mutex_lock(*m); -} - -static int wrap_gcry_mutex_unlock(void** m) -{ - return gnutls_mutex_unlock(*m); -} - -static int wrap_gcry_mutex_deinit(void** m) -{ - gnutls_mutex_deinit(*m); - return 0; -} - -#endif /** * gnutls_global_init: @@ -313,10 +152,7 @@ static int wrap_gcry_mutex_deinit(void** m) * gnutls_global_deinit() when gnutls usage is no longer needed * * Note that this function will also initialize libgcrypt, if it has - * not been initialized before. Thus if you want to manually - * initialize libgcrypt you must do it before calling this function. - * This is useful in cases you want to disable libgcrypt's internal - * lockings etc. + * not been initialized before. * * This function increment a global counter, so that * gnutls_global_deinit() only releases resources when it has been @@ -356,15 +192,7 @@ gnutls_global_init (void) { const char *p; - if (gnutls_mutex_init != NULL) - { - gct.mutex_init = gnutls_mutex_init; - gct.mutex_destroy = wrap_gcry_mutex_deinit; - gct.mutex_lock = wrap_gcry_mutex_lock; - gct.mutex_unlock = wrap_gcry_mutex_unlock; - - gcry_control (GCRYCTL_SET_THREAD_CBS, &gct); - } + _gnutls_gcry_register_mutexes(); p = gcry_check_version (GNUTLS_MIN_LIBGCRYPT_VERSION); diff --git a/lib/gnutls_global.h b/lib/gnutls_global.h index e6bf08e408..081c20d464 100644 --- a/lib/gnutls_global.h +++ b/lib/gnutls_global.h @@ -43,9 +43,4 @@ extern ASN1_TYPE _gnutls_gnutls_asn; extern gnutls_log_func _gnutls_log_func; extern int _gnutls_log_level; -extern mutex_init_func gnutls_mutex_init; -extern mutex_deinit_func gnutls_mutex_deinit; -extern mutex_lock_func gnutls_mutex_lock; -extern mutex_unlock_func gnutls_mutex_unlock; - #endif diff --git a/lib/locks.c b/lib/locks.c new file mode 100644 index 0000000000..3b8a66d234 --- /dev/null +++ b/lib/locks.c @@ -0,0 +1,209 @@ +/* + * Copyright (C) 2010 + * Free Software Foundation, Inc. + * + * Author: Nikos Mavrogiannopoulos + * + * This file is part of GnuTLS. + * + * The GnuTLS 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. + * + * This library 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 library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA + * + */ + +#include +#include +#include +#include +#include +#ifndef HAVE_LIBNETTLE +#include + +#endif + +#ifdef _WIN32 + +# include + +/* FIXME: win32 locks are untested */ +static int gnutls_system_mutex_init (void **priv) +{ + CRITICAL_SECTION *lock = malloc (sizeof (CRITICAL_SECTION)); + int ret; + + if (lock==NULL) + return GNUTLS_E_MEMORY_ERROR; + + InitializeCriticalSection(lock); + + *priv = lock; + + return 0; +} + +static void gnutls_system_mutex_deinit (void *priv) +{ + DeleteCriticalSection(priv); + free(priv); +} + +static int gnutls_system_mutex_lock (void *priv) +{ + EnterCriticalSection(priv); + return 0; +} + +static int gnutls_system_mutex_unlock (void *priv) +{ + LeaveCriticalSection(priv); + return 0; +} + +#else + +# ifdef HAVE_LIBPTHREAD +# include + +static int gnutls_system_mutex_init (void **priv) +{ + pthread_mutex_t *lock = malloc (sizeof (pthread_mutex_t)); + int ret; + + if (lock==NULL) + return GNUTLS_E_MEMORY_ERROR; + + ret = pthread_mutex_init (lock, NULL); + if (ret) + { + free(lock); + gnutls_assert(); + return GNUTLS_E_LOCKING_ERROR; + } + + *priv = lock; + + return 0; +} + +static void gnutls_system_mutex_deinit (void *priv) +{ + pthread_mutex_destroy(priv); + free(priv); +} + +static int gnutls_system_mutex_lock (void *priv) +{ + if (pthread_mutex_lock(priv)) + { + gnutls_assert(); + return GNUTLS_E_LOCKING_ERROR; + } + + return 0; +} + +static int gnutls_system_mutex_unlock (void *priv) +{ + if (pthread_mutex_unlock(priv)) + { + gnutls_assert(); + return GNUTLS_E_LOCKING_ERROR; + } + + return 0; +} + +# else + +#define gnutls_system_mutex_init NULL +#define gnutls_system_mutex_deinit NULL +#define gnutls_system_mutex_lock NULL +#define gnutls_mutex_unlock NULL + +# endif /* PTHREAD */ + +#endif + +mutex_init_func gnutls_mutex_init = gnutls_system_mutex_init; +mutex_deinit_func gnutls_mutex_deinit = gnutls_system_mutex_deinit; +mutex_lock_func gnutls_mutex_lock = gnutls_system_mutex_lock; +mutex_unlock_func gnutls_mutex_unlock = gnutls_system_mutex_unlock; + +/** + * gnutls_global_set_mutex: + * @init: mutex initialization function + * @deinit: mutex deinitialization function + * @lock: mutex locking function + * @unlock: mutex unlocking function + * + * With this function you are allowed to override the default mutex + * locks used in some parts of gnutls and dependent libraries. This function + * should be used if you have complete control of your program and libraries. + * Do not call this function from a library. Instead only initialize gnutls and + * the default OS mutex locks will be used. + * + * This function must be called before gnutls_global_init(). + * + **/ +void gnutls_global_set_mutex(mutex_init_func init, mutex_deinit_func deinit, + mutex_lock_func lock, mutex_unlock_func unlock) +{ + gnutls_mutex_init = init; + gnutls_mutex_deinit = deinit; + gnutls_mutex_lock = lock; + gnutls_mutex_unlock = unlock; +} + +#ifndef HAVE_LIBNETTLE +static struct gcry_thread_cbs gct = { + .option = (GCRY_THREAD_OPTION_PTHREAD | (GCRY_THREAD_OPTION_VERSION << 8)), + .init = NULL, + .select = NULL, + .waitpid = NULL, + .accept = NULL, + .connect = NULL, + .sendmsg = NULL, + .recvmsg = NULL, +}; + +static int wrap_gcry_mutex_lock(void** m) +{ + return gnutls_mutex_lock(*m); +} + +static int wrap_gcry_mutex_unlock(void** m) +{ + return gnutls_mutex_unlock(*m); +} + +static int wrap_gcry_mutex_deinit(void** m) +{ + gnutls_mutex_deinit(*m); + return 0; +} + +void _gnutls_gcry_register_mutexes(void) +{ + if (gnutls_mutex_init != NULL) { + gct.mutex_init = gnutls_mutex_init; + gct.mutex_destroy = wrap_gcry_mutex_deinit; + gct.mutex_lock = wrap_gcry_mutex_lock; + gct.mutex_unlock = wrap_gcry_mutex_unlock; + + gcry_control (GCRYCTL_SET_THREAD_CBS, &gct); + } +} + +#endif diff --git a/lib/locks.h b/lib/locks.h new file mode 100644 index 0000000000..4f8c35581b --- /dev/null +++ b/lib/locks.h @@ -0,0 +1,16 @@ +#ifndef GNUTLS_LOCKS_H +# define GNUTLS_LOCKS_H + +#include +#include + +extern mutex_init_func gnutls_mutex_init; +extern mutex_deinit_func gnutls_mutex_deinit; +extern mutex_lock_func gnutls_mutex_lock; +extern mutex_unlock_func gnutls_mutex_unlock; + +# ifndef HAVE_LIBNETTLE +void _gnutls_gcry_register_mutexes(void); +# endif + +#endif