Update the two threads modules to conform to our recommendations (use
CRYPTO_num_locks() instead of CRYPTO_NUM_LOCKS!), and correct all the inconsistencies with the rest of OpenSSL. At least, this compiles nicely on Linux using PTHREADS. I've done no other tests so far.
This commit is contained in:
parent
1e7396beeb
commit
2d2d31394a
2 changed files with 98 additions and 56 deletions
|
@ -74,26 +74,28 @@
|
|||
#include <ulocks.h>
|
||||
#include <sys/prctl.h>
|
||||
#endif
|
||||
#ifdef PTHREADS
|
||||
#include <pthread.h>
|
||||
#endif
|
||||
#include <openssl/lhash.h>
|
||||
#include <openssl/crypto.h>
|
||||
#include <openssl/buffer.h>
|
||||
#include "../e_os.h"
|
||||
#include "../../e_os.h"
|
||||
#include <openssl/x509.h>
|
||||
#include <openssl/ssl.h>
|
||||
#include <openssl/err.h>
|
||||
|
||||
#ifdef NO_FP_API
|
||||
#define APPS_WIN16
|
||||
#include "../crypto/buffer/bss_file.c"
|
||||
#include "../buffer/bss_file.c"
|
||||
#endif
|
||||
|
||||
#define TEST_SERVER_CERT "../apps/server.pem"
|
||||
#define TEST_CLIENT_CERT "../apps/client.pem"
|
||||
#define TEST_SERVER_CERT "../../apps/server.pem"
|
||||
#define TEST_CLIENT_CERT "../../apps/client.pem"
|
||||
|
||||
#define MAX_THREAD_NUMBER 100
|
||||
|
||||
int MS_CALLBACK verify_callback(int ok, X509 *xs, X509 *xi, int depth,
|
||||
int error,char *arg);
|
||||
int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *xs);
|
||||
void thread_setup(void);
|
||||
void thread_cleanup(void);
|
||||
void do_threads(SSL_CTX *s_ctx,SSL_CTX *c_ctx);
|
||||
|
@ -652,18 +654,22 @@ err:
|
|||
return(0);
|
||||
}
|
||||
|
||||
int MS_CALLBACK verify_callback(int ok, X509 *xs, X509 *xi, int depth,
|
||||
int error, char *arg)
|
||||
int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx)
|
||||
{
|
||||
char buf[256];
|
||||
char *s, buf[256];
|
||||
|
||||
if (verbose)
|
||||
{
|
||||
X509_NAME_oneline(X509_get_subject_name(xs),buf,256);
|
||||
if (ok)
|
||||
fprintf(stderr,"depth=%d %s\n",depth,buf);
|
||||
else
|
||||
fprintf(stderr,"depth=%d error=%d %s\n",depth,error,buf);
|
||||
if (s != NULL)
|
||||
{
|
||||
s=X509_NAME_oneline(X509_get_subject_name(ctx->current_cert),buf,256);
|
||||
if (ok)
|
||||
fprintf(stderr,"depth=%d %s\n",
|
||||
ctx->error_depth,buf);
|
||||
else
|
||||
fprintf(stderr,"depth=%d error=%d %s\n",
|
||||
ctx->error_depth,ctx->error,buf);
|
||||
}
|
||||
}
|
||||
return(ok);
|
||||
}
|
||||
|
@ -672,13 +678,14 @@ int MS_CALLBACK verify_callback(int ok, X509 *xs, X509 *xi, int depth,
|
|||
|
||||
#ifdef WIN32
|
||||
|
||||
static HANDLE lock_cs[CRYPTO_NUM_LOCKS];
|
||||
static HANDLE *lock_cs;
|
||||
|
||||
void thread_setup(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
|
||||
lock_cs=Malloc(CRYPTO_num_locks() * sizeof(HANDLE));
|
||||
for (i=0; i<CRYPTO_num_locks(); i++)
|
||||
{
|
||||
lock_cs[i]=CreateMutex(NULL,FALSE,NULL);
|
||||
}
|
||||
|
@ -692,8 +699,9 @@ void thread_cleanup(void)
|
|||
int i;
|
||||
|
||||
CRYPTO_set_locking_callback(NULL);
|
||||
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
|
||||
for (i=0; i<CRYPTO_num_locks(); i++)
|
||||
CloseHandle(lock_cs[i]);
|
||||
Free(lock_cs);
|
||||
}
|
||||
|
||||
void win32_locking_callback(int mode, int type, char *file, int line)
|
||||
|
@ -763,15 +771,17 @@ void do_threads(SSL_CTX *s_ctx, SSL_CTX *c_ctx)
|
|||
|
||||
#ifdef SOLARIS
|
||||
|
||||
static mutex_t lock_cs[CRYPTO_NUM_LOCKS];
|
||||
/*static rwlock_t lock_cs[CRYPTO_NUM_LOCKS]; */
|
||||
static long lock_count[CRYPTO_NUM_LOCKS];
|
||||
static mutex_t *lock_cs;
|
||||
/*static rwlock_t *lock_cs; */
|
||||
static long *lock_count;
|
||||
|
||||
void thread_setup(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
|
||||
lock_cs=Malloc(CRYPTO_num_locks() * sizeof(mutex_t));
|
||||
lock_count=Malloc(CRYPTO_num_locks() * sizeof(long));
|
||||
for (i=0; i<CRYPTO_num_locks(); i++)
|
||||
{
|
||||
lock_count[i]=0;
|
||||
/* rwlock_init(&(lock_cs[i]),USYNC_THREAD,NULL); */
|
||||
|
@ -787,31 +797,37 @@ void thread_cleanup(void)
|
|||
int i;
|
||||
|
||||
CRYPTO_set_locking_callback(NULL);
|
||||
fprintf(stderr,"cleanup\n");
|
||||
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
|
||||
|
||||
fprintf(stderr,"cleanup\n");
|
||||
|
||||
for (i=0; i<CRYPTO_num_locks(); i++)
|
||||
{
|
||||
/* rwlock_destroy(&(lock_cs[i])); */
|
||||
mutex_destroy(&(lock_cs[i]));
|
||||
fprintf(stderr,"%8ld:%s\n",lock_count[i],CRYPTO_get_lock_name(i));
|
||||
}
|
||||
fprintf(stderr,"done cleanup\n");
|
||||
Free(lock_cs);
|
||||
Free(lock_count);
|
||||
|
||||
fprintf(stderr,"done cleanup\n");
|
||||
|
||||
}
|
||||
|
||||
void solaris_locking_callback(int mode, int type, char *file, int line)
|
||||
{
|
||||
#ifdef undef
|
||||
fprintf(stderr,"thread=%4d mode=%s lock=%s %s:%d\n",
|
||||
CRYPTO_thread_id(),
|
||||
(mode&CRYPTO_LOCK)?"l":"u",
|
||||
(type&CRYPTO_READ)?"r":"w",file,line);
|
||||
fprintf(stderr,"thread=%4d mode=%s lock=%s %s:%d\n",
|
||||
CRYPTO_thread_id(),
|
||||
(mode&CRYPTO_LOCK)?"l":"u",
|
||||
(type&CRYPTO_READ)?"r":"w",file,line);
|
||||
#endif
|
||||
|
||||
/*
|
||||
if (CRYPTO_LOCK_SSL_CERT == type)
|
||||
/*
|
||||
if (CRYPTO_LOCK_SSL_CERT == type)
|
||||
fprintf(stderr,"(t,m,f,l) %ld %d %s %d\n",
|
||||
CRYPTO_thread_id(),
|
||||
mode,file,line);
|
||||
*/
|
||||
*/
|
||||
if (mode & CRYPTO_LOCK)
|
||||
{
|
||||
/* if (mode & CRYPTO_READ)
|
||||
|
@ -871,7 +887,7 @@ unsigned long solaris_thread_id(void)
|
|||
|
||||
|
||||
static usptr_t *arena;
|
||||
static usema_t *lock_cs[CRYPTO_NUM_LOCKS];
|
||||
static usema_t **lock_cs;
|
||||
|
||||
void thread_setup(void)
|
||||
{
|
||||
|
@ -888,7 +904,8 @@ void thread_setup(void)
|
|||
arena=usinit(filename);
|
||||
unlink(filename);
|
||||
|
||||
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
|
||||
lock_cs=Malloc(CRYPTO_num_locks() * sizeof(usema_t *));
|
||||
for (i=0; i<CRYPTO_num_locks(); i++)
|
||||
{
|
||||
lock_cs[i]=usnewsema(arena,1);
|
||||
}
|
||||
|
@ -902,7 +919,7 @@ void thread_cleanup(void)
|
|||
int i;
|
||||
|
||||
CRYPTO_set_locking_callback(NULL);
|
||||
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
|
||||
for (i=0; i<CRYPTO_num_locks(); i++)
|
||||
{
|
||||
char buf[10];
|
||||
|
||||
|
@ -910,6 +927,7 @@ void thread_cleanup(void)
|
|||
usdumpsema(lock_cs[i],stdout,buf);
|
||||
usfreesema(lock_cs[i],arena);
|
||||
}
|
||||
Free(lock_cs);
|
||||
}
|
||||
|
||||
void irix_locking_callback(int mode, int type, char *file, int line)
|
||||
|
@ -962,14 +980,16 @@ unsigned long irix_thread_id(void)
|
|||
|
||||
#ifdef PTHREADS
|
||||
|
||||
static pthread_mutex_t lock_cs[CRYPTO_NUM_LOCKS];
|
||||
static long lock_count[CRYPTO_NUM_LOCKS];
|
||||
static pthread_mutex_t *lock_cs;
|
||||
static long *lock_count;
|
||||
|
||||
void thread_setup(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
|
||||
lock_cs=Malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t));
|
||||
lock_count=Malloc(CRYPTO_num_locks() * sizeof(long));
|
||||
for (i=0; i<CRYPTO_num_locks(); i++)
|
||||
{
|
||||
lock_count[i]=0;
|
||||
pthread_mutex_init(&(lock_cs[i]),NULL);
|
||||
|
@ -985,12 +1005,15 @@ void thread_cleanup(void)
|
|||
|
||||
CRYPTO_set_locking_callback(NULL);
|
||||
fprintf(stderr,"cleanup\n");
|
||||
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
|
||||
for (i=0; i<CRYPTO_num_locks(); i++)
|
||||
{
|
||||
pthread_mutex_destroy(&(lock_cs[i]));
|
||||
fprintf(stderr,"%8ld:%s\n",lock_count[i],
|
||||
CRYPTO_get_lock_name(i));
|
||||
}
|
||||
Free(lock_cs);
|
||||
Free(lock_count);
|
||||
|
||||
fprintf(stderr,"done cleanup\n");
|
||||
}
|
||||
|
||||
|
@ -1045,7 +1068,7 @@ void do_threads(SSL_CTX *s_ctx, SSL_CTX *c_ctx)
|
|||
}
|
||||
|
||||
printf("pthreads threads done (%d,%d)\n",
|
||||
s_ctx->references,c_ctx->references);
|
||||
s_ctx->references,c_ctx->references);
|
||||
}
|
||||
|
||||
unsigned long pthreads_thread_id(void)
|
||||
|
|
|
@ -74,6 +74,9 @@
|
|||
#include <ulocks.h>
|
||||
#include <sys/prctl.h>
|
||||
#endif
|
||||
#ifdef PTHREADS
|
||||
#include <pthread.h>
|
||||
#endif
|
||||
#include <openssl/lhash.h>
|
||||
#include <openssl/crypto.h>
|
||||
#include <openssl/buffer.h>
|
||||
|
@ -82,7 +85,7 @@
|
|||
#include <openssl/ssl.h>
|
||||
#include <openssl/err.h>
|
||||
|
||||
int CRYPTO_thread_setup(void);
|
||||
void CRYPTO_thread_setup(void);
|
||||
void CRYPTO_thread_cleanup(void);
|
||||
|
||||
static void irix_locking_callback(int mode,int type,char *file,int line);
|
||||
|
@ -104,13 +107,14 @@ static unsigned long pthreads_thread_id(void );
|
|||
|
||||
#ifdef WIN32
|
||||
|
||||
static HANDLE lock_cs[CRYPTO_NUM_LOCKS];
|
||||
static HANDLE *lock_cs;
|
||||
|
||||
int CRYPTO_thread_setup(void)
|
||||
void CRYPTO_thread_setup(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
|
||||
lock_cs=Malloc(CRYPTO_num_locks() * sizeof(HANDLE));
|
||||
for (i=0; i<CRYPTO_num_locks(); i++)
|
||||
{
|
||||
lock_cs[i]=CreateMutex(NULL,FALSE,NULL);
|
||||
}
|
||||
|
@ -125,8 +129,9 @@ static void CRYPTO_thread_cleanup(void)
|
|||
int i;
|
||||
|
||||
CRYPTO_set_locking_callback(NULL);
|
||||
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
|
||||
for (i=0; i<CRYPTO_num_locks(); i++)
|
||||
CloseHandle(lock_cs[i]);
|
||||
Free(lock_cs);
|
||||
}
|
||||
|
||||
void win32_locking_callback(int mode, int type, char *file, int line)
|
||||
|
@ -147,18 +152,24 @@ void win32_locking_callback(int mode, int type, char *file, int line)
|
|||
|
||||
#define USE_MUTEX
|
||||
|
||||
static mutex_t lock_cs[CRYPTO_NUM_LOCKS];
|
||||
#ifdef USE_MUTEX
|
||||
static long lock_count[CRYPTO_NUM_LOCKS];
|
||||
static mutex_t *lock_cs;
|
||||
#else
|
||||
static rwlock_t lock_cs[CRYPTO_NUM_LOCKS];
|
||||
static rwlock_t *lock_cs;
|
||||
#endif
|
||||
static long *lock_count;
|
||||
|
||||
void CRYPTO_thread_setup(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
|
||||
#ifdef USE_MUTEX
|
||||
lock_cs=Malloc(CRYPTO_num_locks() * sizeof(mutex_t));
|
||||
#else
|
||||
lock_cs=Malloc(CRYPTO_num_locks() * sizeof(rwlock_t));
|
||||
#endif
|
||||
lock_count=Malloc(CRYPTO_num_locks() * sizeof(long));
|
||||
for (i=0; i<CRYPTO_num_locks(); i++)
|
||||
{
|
||||
lock_count[i]=0;
|
||||
#ifdef USE_MUTEX
|
||||
|
@ -177,7 +188,7 @@ void CRYPTO_thread_cleanup(void)
|
|||
int i;
|
||||
|
||||
CRYPTO_set_locking_callback(NULL);
|
||||
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
|
||||
for (i=0; i<CRYPTO_num_locks(); i++)
|
||||
{
|
||||
#ifdef USE_MUTEX
|
||||
mutex_destroy(&(lock_cs[i]));
|
||||
|
@ -185,6 +196,8 @@ void CRYPTO_thread_cleanup(void)
|
|||
rwlock_destroy(&(lock_cs[i]));
|
||||
#endif
|
||||
}
|
||||
Free(lock_cs);
|
||||
Free(lock_count);
|
||||
}
|
||||
|
||||
void solaris_locking_callback(int mode, int type, char *file, int line)
|
||||
|
@ -237,7 +250,7 @@ unsigned long solaris_thread_id(void)
|
|||
/* I don't think this works..... */
|
||||
|
||||
static usptr_t *arena;
|
||||
static usema_t *lock_cs[CRYPTO_NUM_LOCKS];
|
||||
static usema_t **lock_cs;
|
||||
|
||||
void CRYPTO_thread_setup(void)
|
||||
{
|
||||
|
@ -254,7 +267,8 @@ void CRYPTO_thread_setup(void)
|
|||
arena=usinit(filename);
|
||||
unlink(filename);
|
||||
|
||||
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
|
||||
lock_cs=Malloc(CRYPTO_num_locks() * sizeof(usema_t *));
|
||||
for (i=0; i<CRYPTO_num_locks(); i++)
|
||||
{
|
||||
lock_cs[i]=usnewsema(arena,1);
|
||||
}
|
||||
|
@ -268,7 +282,7 @@ void CRYPTO_thread_cleanup(void)
|
|||
int i;
|
||||
|
||||
CRYPTO_set_locking_callback(NULL);
|
||||
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
|
||||
for (i=0; i<CRYPTO_num_locks(); i++)
|
||||
{
|
||||
char buf[10];
|
||||
|
||||
|
@ -276,6 +290,7 @@ void CRYPTO_thread_cleanup(void)
|
|||
usdumpsema(lock_cs[i],stdout,buf);
|
||||
usfreesema(lock_cs[i],arena);
|
||||
}
|
||||
Free(lock_cs);
|
||||
}
|
||||
|
||||
void irix_locking_callback(int mode, int type, char *file, int line)
|
||||
|
@ -302,14 +317,16 @@ unsigned long irix_thread_id(void)
|
|||
/* Linux and a few others */
|
||||
#ifdef PTHREADS
|
||||
|
||||
static pthread_mutex_t lock_cs[CRYPTO_NUM_LOCKS];
|
||||
static long lock_count[CRYPTO_NUM_LOCKS];
|
||||
static pthread_mutex_t *lock_cs;
|
||||
static long *lock_count;
|
||||
|
||||
void CRYPTO_thread_setup(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
|
||||
lock_cs=Malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t));
|
||||
lock_count=Malloc(CRYPTO_num_locks() * sizeof(long));
|
||||
for (i=0; i<CRYPTO_num_locks(); i++)
|
||||
{
|
||||
lock_count[i]=0;
|
||||
pthread_mutex_init(&(lock_cs[i]),NULL);
|
||||
|
@ -324,10 +341,12 @@ void thread_cleanup(void)
|
|||
int i;
|
||||
|
||||
CRYPTO_set_locking_callback(NULL);
|
||||
for (i=0; i<CRYPTO_NUM_LOCKS; i++)
|
||||
for (i=0; i<CRYPTO_num_locks(); i++)
|
||||
{
|
||||
pthread_mutex_destroy(&(lock_cs[i]));
|
||||
}
|
||||
Free(lock_cs);
|
||||
Free(lock_count);
|
||||
}
|
||||
|
||||
void pthreads_locking_callback(int mode, int type, char *file,
|
||||
|
|
Loading…
Reference in a new issue