| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | /* crypto/cryptlib.c */ | 
					
						
							| 
									
										
										
										
											2002-10-28 22:02:19 +08:00
										 |  |  | /* ====================================================================
 | 
					
						
							|  |  |  |  * Copyright (c) 1998-2002 The OpenSSL Project.  All rights reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Redistribution and use in source and binary forms, with or without | 
					
						
							|  |  |  |  * modification, are permitted provided that the following conditions | 
					
						
							|  |  |  |  * are met: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 1. Redistributions of source code must retain the above copyright | 
					
						
							|  |  |  |  *    notice, this list of conditions and the following disclaimer.  | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 2. Redistributions in binary form must reproduce the above copyright | 
					
						
							|  |  |  |  *    notice, this list of conditions and the following disclaimer in | 
					
						
							|  |  |  |  *    the documentation and/or other materials provided with the | 
					
						
							|  |  |  |  *    distribution. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 3. All advertising materials mentioning features or use of this | 
					
						
							|  |  |  |  *    software must display the following acknowledgment: | 
					
						
							|  |  |  |  *    "This product includes software developed by the OpenSSL Project | 
					
						
							|  |  |  |  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to | 
					
						
							|  |  |  |  *    endorse or promote products derived from this software without | 
					
						
							|  |  |  |  *    prior written permission. For written permission, please contact | 
					
						
							|  |  |  |  *    openssl-core@openssl.org. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 5. Products derived from this software may not be called "OpenSSL" | 
					
						
							|  |  |  |  *    nor may "OpenSSL" appear in their names without prior written | 
					
						
							|  |  |  |  *    permission of the OpenSSL Project. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 6. Redistributions of any form whatsoever must retain the following | 
					
						
							|  |  |  |  *    acknowledgment: | 
					
						
							|  |  |  |  *    "This product includes software developed by the OpenSSL Project | 
					
						
							|  |  |  |  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY | 
					
						
							|  |  |  |  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
					
						
							|  |  |  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | 
					
						
							|  |  |  |  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR | 
					
						
							|  |  |  |  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
					
						
							|  |  |  |  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | 
					
						
							|  |  |  |  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 
					
						
							|  |  |  |  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | 
					
						
							|  |  |  |  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | 
					
						
							|  |  |  |  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 
					
						
							|  |  |  |  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | 
					
						
							|  |  |  |  * OF THE POSSIBILITY OF SUCH DAMAGE. | 
					
						
							|  |  |  |  * ==================================================================== | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This product includes cryptographic software written by Eric Young | 
					
						
							|  |  |  |  * (eay@cryptsoft.com).  This product includes software written by Tim | 
					
						
							|  |  |  |  * Hudson (tjh@cryptsoft.com). | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											1998-12-21 18:56:39 +08:00
										 |  |  | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  |  * All rights reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This package is an SSL implementation written | 
					
						
							|  |  |  |  * by Eric Young (eay@cryptsoft.com). | 
					
						
							|  |  |  |  * The implementation was written so as to conform with Netscapes SSL. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * This library is free for commercial and non-commercial use as long as | 
					
						
							|  |  |  |  * the following conditions are aheared to.  The following conditions | 
					
						
							|  |  |  |  * apply to all code found in this distribution, be it the RC4, RSA, | 
					
						
							|  |  |  |  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation | 
					
						
							|  |  |  |  * included with this distribution is covered by the same copyright terms | 
					
						
							|  |  |  |  * except that the holder is Tim Hudson (tjh@cryptsoft.com). | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * Copyright remains Eric Young's, and as such any Copyright notices in | 
					
						
							|  |  |  |  * the code are not to be removed. | 
					
						
							|  |  |  |  * If this package is used in a product, Eric Young should be given attribution | 
					
						
							|  |  |  |  * as the author of the parts of the library used. | 
					
						
							|  |  |  |  * This can be in the form of a textual message at program startup or | 
					
						
							|  |  |  |  * in documentation (online or textual) provided with the package. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * Redistribution and use in source and binary forms, with or without | 
					
						
							|  |  |  |  * modification, are permitted provided that the following conditions | 
					
						
							|  |  |  |  * are met: | 
					
						
							|  |  |  |  * 1. Redistributions of source code must retain the copyright | 
					
						
							|  |  |  |  *    notice, this list of conditions and the following disclaimer. | 
					
						
							|  |  |  |  * 2. Redistributions in binary form must reproduce the above copyright | 
					
						
							|  |  |  |  *    notice, this list of conditions and the following disclaimer in the | 
					
						
							|  |  |  |  *    documentation and/or other materials provided with the distribution. | 
					
						
							|  |  |  |  * 3. All advertising materials mentioning features or use of this software | 
					
						
							|  |  |  |  *    must display the following acknowledgement: | 
					
						
							|  |  |  |  *    "This product includes cryptographic software written by | 
					
						
							|  |  |  |  *     Eric Young (eay@cryptsoft.com)" | 
					
						
							|  |  |  |  *    The word 'cryptographic' can be left out if the rouines from the library | 
					
						
							|  |  |  |  *    being used are not cryptographic related :-). | 
					
						
							|  |  |  |  * 4. If you include any Windows specific code (or a derivative thereof) from  | 
					
						
							|  |  |  |  *    the apps directory (application code) you must include an acknowledgement: | 
					
						
							|  |  |  |  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND | 
					
						
							|  |  |  |  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
					
						
							|  |  |  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 
					
						
							|  |  |  |  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | 
					
						
							|  |  |  |  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | 
					
						
							|  |  |  |  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | 
					
						
							|  |  |  |  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | 
					
						
							|  |  |  |  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | 
					
						
							|  |  |  |  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | 
					
						
							|  |  |  |  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | 
					
						
							|  |  |  |  * SUCH DAMAGE. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * The licence and distribution terms for any publically available version or | 
					
						
							|  |  |  |  * derivative of this code cannot be changed.  i.e. this code cannot simply be | 
					
						
							|  |  |  |  * copied and put under another distribution licence | 
					
						
							|  |  |  |  * [including the GNU Public Licence.] | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2002-08-09 16:43:04 +08:00
										 |  |  | /* ====================================================================
 | 
					
						
							|  |  |  |  * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. | 
					
						
							|  |  |  |  * ECDH support in OpenSSL originally developed by  | 
					
						
							|  |  |  |  * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #include "cryptlib.h"
 | 
					
						
							| 
									
										
										
										
											1999-04-24 06:13:45 +08:00
										 |  |  | #include <openssl/crypto.h>
 | 
					
						
							| 
									
										
										
										
											2000-06-18 23:59:04 +08:00
										 |  |  | #include <openssl/safestack.h>
 | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-02-20 16:13:47 +08:00
										 |  |  | #if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WIN16)
 | 
					
						
							| 
									
										
										
										
											1998-12-21 18:56:39 +08:00
										 |  |  | static double SSLeay_MSVC5_hack=0.0; /* and for VC1.5 */ | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-06-21 02:45:28 +08:00
										 |  |  | DECLARE_STACK_OF(CRYPTO_dynlock) | 
					
						
							|  |  |  | IMPLEMENT_STACK_OF(CRYPTO_dynlock) | 
					
						
							| 
									
										
										
										
											2000-06-18 23:59:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | /* real #defines in crypto.h, keep these upto date */ | 
					
						
							| 
									
										
										
										
											1999-04-18 05:25:43 +08:00
										 |  |  | static const char* lock_names[CRYPTO_NUM_LOCKS] = | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 	"<<ERROR>>", | 
					
						
							|  |  |  | 	"err", | 
					
						
							| 
									
										
										
										
											2001-09-06 20:37:36 +08:00
										 |  |  | 	"ex_data", | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	"x509", | 
					
						
							|  |  |  | 	"x509_info", | 
					
						
							|  |  |  | 	"x509_pkey", | 
					
						
							|  |  |  | 	"x509_crl", | 
					
						
							|  |  |  | 	"x509_req", | 
					
						
							|  |  |  | 	"dsa", | 
					
						
							|  |  |  | 	"rsa", | 
					
						
							|  |  |  | 	"evp_pkey", | 
					
						
							|  |  |  | 	"x509_store", | 
					
						
							|  |  |  | 	"ssl_ctx", | 
					
						
							|  |  |  | 	"ssl_cert", | 
					
						
							|  |  |  | 	"ssl_session", | 
					
						
							| 
									
										
										
										
											1999-05-14 19:57:17 +08:00
										 |  |  | 	"ssl_sess_cert", | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	"ssl", | 
					
						
							| 
									
										
										
										
											2002-09-23 22:25:07 +08:00
										 |  |  | 	"ssl_method", | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	"rand", | 
					
						
							| 
									
										
										
										
											2001-07-26 01:17:24 +08:00
										 |  |  | 	"rand2", | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	"debug_malloc", | 
					
						
							|  |  |  | 	"BIO", | 
					
						
							| 
									
										
										
										
											1999-05-14 20:40:39 +08:00
										 |  |  | 	"gethostbyname", | 
					
						
							|  |  |  | 	"getservbyname", | 
					
						
							|  |  |  | 	"readdir", | 
					
						
							| 
									
										
										
										
											1998-12-21 18:56:39 +08:00
										 |  |  | 	"RSA_blinding", | 
					
						
							| 
									
										
										
										
											1999-08-24 07:11:32 +08:00
										 |  |  | 	"dh", | 
					
						
							| 
									
										
										
										
											1999-11-12 10:51:24 +08:00
										 |  |  | 	"debug_malloc2", | 
					
						
							| 
									
										
										
										
											2000-04-05 06:32:19 +08:00
										 |  |  | 	"dso", | 
					
						
							| 
									
										
										
										
											2000-06-19 21:38:09 +08:00
										 |  |  | 	"dynlock", | 
					
						
							| 
									
										
										
										
											2000-10-27 05:07:28 +08:00
										 |  |  | 	"engine", | 
					
						
							| 
									
										
										
										
											2001-05-07 07:19:37 +08:00
										 |  |  | 	"ui", | 
					
						
							| 
									
										
										
										
											2002-02-14 01:25:27 +08:00
										 |  |  | 	"ecdsa", | 
					
						
							|  |  |  | 	"ec", | 
					
						
							| 
									
										
										
										
											2002-08-09 16:43:04 +08:00
										 |  |  | 	"ecdh", | 
					
						
							| 
									
										
										
										
											2002-10-28 22:02:19 +08:00
										 |  |  | 	"bn", | 
					
						
							|  |  |  | #if CRYPTO_NUM_LOCKS != 36
 | 
					
						
							| 
									
										
										
										
											1999-05-14 20:40:39 +08:00
										 |  |  | # error "Inconsistency between crypto.h and cryptlib.c"
 | 
					
						
							| 
									
										
										
										
											1999-05-14 19:57:17 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-06-18 23:59:04 +08:00
										 |  |  | /* This is for applications to allocate new type names in the non-dynamic
 | 
					
						
							|  |  |  |    array of lock names.  These are numbered with positive numbers.  */ | 
					
						
							| 
									
										
										
										
											1998-12-21 18:56:39 +08:00
										 |  |  | static STACK *app_locks=NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-06-18 23:59:04 +08:00
										 |  |  | /* For applications that want a more dynamic way of handling threads, the
 | 
					
						
							|  |  |  |    following stack is used.  These are externally numbered with negative | 
					
						
							|  |  |  |    numbers.  */ | 
					
						
							|  |  |  | static STACK_OF(CRYPTO_dynlock) *dyn_locks=NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | static void (MS_FAR *locking_callback)(int mode,int type, | 
					
						
							| 
									
										
										
										
											1999-04-18 05:25:43 +08:00
										 |  |  | 	const char *file,int line)=NULL; | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | static int (MS_FAR *add_lock_callback)(int *pointer,int amount, | 
					
						
							| 
									
										
										
										
											1999-04-18 05:25:43 +08:00
										 |  |  | 	int type,const char *file,int line)=NULL; | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | static unsigned long (MS_FAR *id_callback)(void)=NULL; | 
					
						
							| 
									
										
										
										
											2000-06-19 21:38:09 +08:00
										 |  |  | static struct CRYPTO_dynlock_value *(MS_FAR *dynlock_create_callback) | 
					
						
							|  |  |  | 	(const char *file,int line)=NULL; | 
					
						
							| 
									
										
										
										
											2000-06-20 00:38:27 +08:00
										 |  |  | static void (MS_FAR *dynlock_lock_callback)(int mode, | 
					
						
							| 
									
										
										
										
											2000-06-19 21:38:09 +08:00
										 |  |  | 	struct CRYPTO_dynlock_value *l, const char *file,int line)=NULL; | 
					
						
							|  |  |  | static void (MS_FAR *dynlock_destroy_callback)(struct CRYPTO_dynlock_value *l, | 
					
						
							| 
									
										
										
										
											2000-06-18 23:59:04 +08:00
										 |  |  | 	const char *file,int line)=NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-04-20 05:31:43 +08:00
										 |  |  | int CRYPTO_get_new_lockid(char *name) | 
					
						
							| 
									
										
										
										
											1998-12-21 18:56:39 +08:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 	char *str; | 
					
						
							|  |  |  | 	int i; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-02-20 16:13:47 +08:00
										 |  |  | #if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WIN16)
 | 
					
						
							| 
									
										
										
										
											1998-12-21 18:56:39 +08:00
										 |  |  | 	/* A hack to make Visual C++ 5.0 work correctly when linking as
 | 
					
						
							|  |  |  | 	 * a DLL using /MT. Without this, the application cannot use | 
					
						
							|  |  |  | 	 * and floating point printf's. | 
					
						
							|  |  |  | 	 * It also seems to be needed for Visual C 1.5 (win16) */ | 
					
						
							|  |  |  | 	SSLeay_MSVC5_hack=(double)name[0]*(double)name[1]; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-12-21 19:00:56 +08:00
										 |  |  | 	if ((app_locks == NULL) && ((app_locks=sk_new_null()) == NULL)) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		CRYPTOerr(CRYPTO_F_CRYPTO_GET_NEW_LOCKID,ERR_R_MALLOC_FAILURE); | 
					
						
							|  |  |  | 		return(0); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											1998-12-21 18:56:39 +08:00
										 |  |  | 	if ((str=BUF_strdup(name)) == NULL) | 
					
						
							| 
									
										
										
										
											2000-06-18 23:59:04 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 		CRYPTOerr(CRYPTO_F_CRYPTO_GET_NEW_LOCKID,ERR_R_MALLOC_FAILURE); | 
					
						
							| 
									
										
										
										
											1998-12-21 18:56:39 +08:00
										 |  |  | 		return(0); | 
					
						
							| 
									
										
										
										
											2000-06-18 23:59:04 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											1998-12-21 18:56:39 +08:00
										 |  |  | 	i=sk_push(app_locks,str); | 
					
						
							|  |  |  | 	if (!i) | 
					
						
							| 
									
										
										
										
											2000-06-02 06:19:21 +08:00
										 |  |  | 		OPENSSL_free(str); | 
					
						
							| 
									
										
										
										
											1998-12-21 18:56:39 +08:00
										 |  |  | 	else | 
					
						
							|  |  |  | 		i+=CRYPTO_NUM_LOCKS; /* gap of one :-) */ | 
					
						
							|  |  |  | 	return(i); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-06-19 00:14:18 +08:00
										 |  |  | int CRYPTO_num_locks(void) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	return CRYPTO_NUM_LOCKS; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-06-18 23:59:04 +08:00
										 |  |  | int CRYPTO_get_new_dynlockid(void) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	int i = 0; | 
					
						
							|  |  |  | 	CRYPTO_dynlock *pointer = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (dynlock_create_callback == NULL) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		CRYPTOerr(CRYPTO_F_CRYPTO_GET_NEW_DYNLOCKID,CRYPTO_R_NO_DYNLOCK_CREATE_CALLBACK); | 
					
						
							|  |  |  | 		return(0); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2000-06-19 21:38:09 +08:00
										 |  |  | 	CRYPTO_w_lock(CRYPTO_LOCK_DYNLOCK); | 
					
						
							| 
									
										
										
										
											2000-06-18 23:59:04 +08:00
										 |  |  | 	if ((dyn_locks == NULL) | 
					
						
							| 
									
										
										
										
											2000-06-21 02:45:28 +08:00
										 |  |  | 		&& ((dyn_locks=sk_CRYPTO_dynlock_new_null()) == NULL)) | 
					
						
							| 
									
										
										
										
											2000-06-18 23:59:04 +08:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2000-06-19 21:38:09 +08:00
										 |  |  | 		CRYPTO_w_unlock(CRYPTO_LOCK_DYNLOCK); | 
					
						
							| 
									
										
										
										
											2000-06-18 23:59:04 +08:00
										 |  |  | 		CRYPTOerr(CRYPTO_F_CRYPTO_GET_NEW_DYNLOCKID,ERR_R_MALLOC_FAILURE); | 
					
						
							|  |  |  | 		return(0); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2000-06-19 21:38:09 +08:00
										 |  |  | 	CRYPTO_w_unlock(CRYPTO_LOCK_DYNLOCK); | 
					
						
							| 
									
										
										
										
											2000-06-18 23:59:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-06-19 21:38:09 +08:00
										 |  |  | 	pointer = (CRYPTO_dynlock *)OPENSSL_malloc(sizeof(CRYPTO_dynlock)); | 
					
						
							| 
									
										
										
										
											2000-06-18 23:59:04 +08:00
										 |  |  | 	if (pointer == NULL) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		CRYPTOerr(CRYPTO_F_CRYPTO_GET_NEW_DYNLOCKID,ERR_R_MALLOC_FAILURE); | 
					
						
							|  |  |  | 		return(0); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2000-06-19 21:38:09 +08:00
										 |  |  | 	pointer->references = 1; | 
					
						
							|  |  |  | 	pointer->data = dynlock_create_callback(__FILE__,__LINE__); | 
					
						
							|  |  |  | 	if (pointer->data == NULL) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		OPENSSL_free(pointer); | 
					
						
							|  |  |  | 		CRYPTOerr(CRYPTO_F_CRYPTO_GET_NEW_DYNLOCKID,ERR_R_MALLOC_FAILURE); | 
					
						
							|  |  |  | 		return(0); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	CRYPTO_w_lock(CRYPTO_LOCK_DYNLOCK); | 
					
						
							| 
									
										
										
										
											2000-06-20 00:38:27 +08:00
										 |  |  | 	/* First, try to find an existing empty slot */ | 
					
						
							|  |  |  | 	i=sk_CRYPTO_dynlock_find(dyn_locks,NULL); | 
					
						
							|  |  |  | 	/* If there was none, push, thereby creating a new one */ | 
					
						
							|  |  |  | 	if (i == -1) | 
					
						
							| 
									
										
										
										
											2002-12-11 16:33:31 +08:00
										 |  |  | 		/* Since sk_push() returns the number of items on the
 | 
					
						
							|  |  |  | 		   stack, not the location of the pushed item, we need | 
					
						
							|  |  |  | 		   to transform the returned number into a position, | 
					
						
							|  |  |  | 		   by decreasing it.  */ | 
					
						
							|  |  |  | 		i=sk_CRYPTO_dynlock_push(dyn_locks,pointer) - 1; | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		/* If we found a place with a NULL pointer, put our pointer
 | 
					
						
							|  |  |  | 		   in it.  */ | 
					
						
							|  |  |  | 		sk_CRYPTO_dynlock_set(dyn_locks,i,pointer); | 
					
						
							| 
									
										
										
										
											2000-06-19 21:38:09 +08:00
										 |  |  | 	CRYPTO_w_unlock(CRYPTO_LOCK_DYNLOCK); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-12-11 16:33:31 +08:00
										 |  |  | 	if (i == -1) | 
					
						
							| 
									
										
										
										
											2000-06-19 21:38:09 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 		dynlock_destroy_callback(pointer->data,__FILE__,__LINE__); | 
					
						
							|  |  |  | 		OPENSSL_free(pointer); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2000-06-18 23:59:04 +08:00
										 |  |  | 	else | 
					
						
							|  |  |  | 		i += 1; /* to avoid 0 */ | 
					
						
							|  |  |  | 	return -i; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CRYPTO_destroy_dynlockid(int i) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2000-06-19 21:38:09 +08:00
										 |  |  | 	CRYPTO_dynlock *pointer = NULL; | 
					
						
							| 
									
										
										
										
											2000-06-18 23:59:04 +08:00
										 |  |  | 	if (i) | 
					
						
							|  |  |  | 		i = -i-1; | 
					
						
							|  |  |  | 	if (dynlock_destroy_callback == NULL) | 
					
						
							|  |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2000-06-19 21:38:09 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	CRYPTO_w_lock(CRYPTO_LOCK_DYNLOCK); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (dyn_locks == NULL || i >= sk_CRYPTO_dynlock_num(dyn_locks)) | 
					
						
							| 
									
										
										
										
											2001-11-24 04:58:40 +08:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2001-11-24 12:02:42 +08:00
										 |  |  | 		CRYPTO_w_unlock(CRYPTO_LOCK_DYNLOCK); | 
					
						
							| 
									
										
										
										
											2000-06-19 21:38:09 +08:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2001-11-24 04:58:40 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2000-06-19 21:38:09 +08:00
										 |  |  | 	pointer = sk_CRYPTO_dynlock_value(dyn_locks, i); | 
					
						
							|  |  |  | 	if (pointer != NULL) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		--pointer->references; | 
					
						
							|  |  |  | #ifdef REF_CHECK
 | 
					
						
							|  |  |  | 		if (pointer->references < 0) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 			fprintf(stderr,"CRYPTO_destroy_dynlockid, bad reference count\n"); | 
					
						
							|  |  |  | 			abort(); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2001-06-01 06:25:30 +08:00
										 |  |  | 			if (pointer->references <= 0) | 
					
						
							| 
									
										
										
										
											2000-06-19 21:38:09 +08:00
										 |  |  | 				{ | 
					
						
							|  |  |  | 				sk_CRYPTO_dynlock_set(dyn_locks, i, NULL); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			else | 
					
						
							|  |  |  | 				pointer = NULL; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	CRYPTO_w_unlock(CRYPTO_LOCK_DYNLOCK); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (pointer) | 
					
						
							| 
									
										
										
										
											2000-06-19 21:53:15 +08:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2000-06-19 21:38:09 +08:00
										 |  |  | 		dynlock_destroy_callback(pointer->data,__FILE__,__LINE__); | 
					
						
							| 
									
										
										
										
											2000-06-19 21:53:15 +08:00
										 |  |  | 		OPENSSL_free(pointer); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2000-06-18 23:59:04 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-06-19 21:38:09 +08:00
										 |  |  | struct CRYPTO_dynlock_value *CRYPTO_get_dynlock_value(int i) | 
					
						
							| 
									
										
										
										
											2000-06-18 23:59:04 +08:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2000-06-19 21:38:09 +08:00
										 |  |  | 	CRYPTO_dynlock *pointer = NULL; | 
					
						
							| 
									
										
										
										
											2000-06-18 23:59:04 +08:00
										 |  |  | 	if (i) | 
					
						
							|  |  |  | 		i = -i-1; | 
					
						
							| 
									
										
										
										
											2000-06-19 21:38:09 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	CRYPTO_w_lock(CRYPTO_LOCK_DYNLOCK); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (dyn_locks != NULL && i < sk_CRYPTO_dynlock_num(dyn_locks)) | 
					
						
							|  |  |  | 		pointer = sk_CRYPTO_dynlock_value(dyn_locks, i); | 
					
						
							|  |  |  | 	if (pointer) | 
					
						
							|  |  |  | 		pointer->references++; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	CRYPTO_w_unlock(CRYPTO_LOCK_DYNLOCK); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (pointer) | 
					
						
							|  |  |  | 		return pointer->data; | 
					
						
							|  |  |  | 	return NULL; | 
					
						
							| 
									
										
										
										
											2000-06-18 23:59:04 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-06-20 00:38:27 +08:00
										 |  |  | struct CRYPTO_dynlock_value *(*CRYPTO_get_dynlock_create_callback(void)) | 
					
						
							|  |  |  | 	(const char *file,int line) | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2000-06-20 00:38:27 +08:00
										 |  |  | 	return(dynlock_create_callback); | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-06-19 21:38:09 +08:00
										 |  |  | void (*CRYPTO_get_dynlock_lock_callback(void))(int mode, | 
					
						
							|  |  |  | 	struct CRYPTO_dynlock_value *l, const char *file,int line) | 
					
						
							| 
									
										
										
										
											2000-06-18 23:59:04 +08:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2000-06-20 00:38:27 +08:00
										 |  |  | 	return(dynlock_lock_callback); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void (*CRYPTO_get_dynlock_destroy_callback(void)) | 
					
						
							|  |  |  | 	(struct CRYPTO_dynlock_value *l, const char *file,int line) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	return(dynlock_destroy_callback); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CRYPTO_set_dynlock_create_callback(struct CRYPTO_dynlock_value *(*func) | 
					
						
							|  |  |  | 	(const char *file, int line)) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	dynlock_create_callback=func; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CRYPTO_set_dynlock_lock_callback(void (*func)(int mode, | 
					
						
							|  |  |  | 	struct CRYPTO_dynlock_value *l, const char *file, int line)) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	dynlock_lock_callback=func; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CRYPTO_set_dynlock_destroy_callback(void (*func) | 
					
						
							|  |  |  | 	(struct CRYPTO_dynlock_value *l, const char *file, int line)) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	dynlock_destroy_callback=func; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void (*CRYPTO_get_locking_callback(void))(int mode,int type,const char *file, | 
					
						
							|  |  |  | 		int line) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	return(locking_callback); | 
					
						
							| 
									
										
										
										
											2000-06-18 23:59:04 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-04-18 05:25:43 +08:00
										 |  |  | int (*CRYPTO_get_add_lock_callback(void))(int *num,int mount,int type, | 
					
						
							|  |  |  | 					  const char *file,int line) | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 	return(add_lock_callback); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-04-18 05:25:43 +08:00
										 |  |  | void CRYPTO_set_locking_callback(void (*func)(int mode,int type, | 
					
						
							|  |  |  | 					      const char *file,int line)) | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 	locking_callback=func; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-04-18 05:25:43 +08:00
										 |  |  | void CRYPTO_set_add_lock_callback(int (*func)(int *num,int mount,int type, | 
					
						
							|  |  |  | 					      const char *file,int line)) | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 	add_lock_callback=func; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-04-27 06:20:07 +08:00
										 |  |  | unsigned long (*CRYPTO_get_id_callback(void))(void) | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 	return(id_callback); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-04-27 06:20:07 +08:00
										 |  |  | void CRYPTO_set_id_callback(unsigned long (*func)(void)) | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 	id_callback=func; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-04-20 05:31:43 +08:00
										 |  |  | unsigned long CRYPTO_thread_id(void) | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 	unsigned long ret=0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (id_callback == NULL) | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2001-02-20 16:13:47 +08:00
										 |  |  | #ifdef OPENSSL_SYS_WIN16
 | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 		ret=(unsigned long)GetCurrentTask(); | 
					
						
							| 
									
										
										
										
											2001-02-20 16:13:47 +08:00
										 |  |  | #elif defined(OPENSSL_SYS_WIN32)
 | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 		ret=(unsigned long)GetCurrentThreadId(); | 
					
						
							| 
									
										
										
										
											1999-12-20 05:35:29 +08:00
										 |  |  | #elif defined(GETPID_IS_MEANINGLESS)
 | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 		ret=1L; | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | 		ret=(unsigned long)getpid(); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		ret=id_callback(); | 
					
						
							|  |  |  | 	return(ret); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-04-20 05:31:43 +08:00
										 |  |  | void CRYPTO_lock(int mode, int type, const char *file, int line) | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	{ | 
					
						
							|  |  |  | #ifdef LOCK_DEBUG
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		char *rw_text,*operation_text; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (mode & CRYPTO_LOCK) | 
					
						
							|  |  |  | 			operation_text="lock  "; | 
					
						
							|  |  |  | 		else if (mode & CRYPTO_UNLOCK) | 
					
						
							|  |  |  | 			operation_text="unlock"; | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			operation_text="ERROR "; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (mode & CRYPTO_READ) | 
					
						
							|  |  |  | 			rw_text="r"; | 
					
						
							|  |  |  | 		else if (mode & CRYPTO_WRITE) | 
					
						
							|  |  |  | 			rw_text="w"; | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			rw_text="ERROR"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		fprintf(stderr,"lock:%08lx:(%s)%s %-18s %s:%d\n", | 
					
						
							|  |  |  | 			CRYPTO_thread_id(), rw_text, operation_text, | 
					
						
							|  |  |  | 			CRYPTO_get_lock_name(type), file, line); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2000-06-18 23:59:04 +08:00
										 |  |  | 	if (type < 0) | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2002-12-11 16:56:35 +08:00
										 |  |  | 		if (dynlock_lock_callback != NULL) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 			struct CRYPTO_dynlock_value *pointer | 
					
						
							|  |  |  | 				= CRYPTO_get_dynlock_value(type); | 
					
						
							| 
									
										
										
										
											2000-06-19 21:38:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-12-11 16:56:35 +08:00
										 |  |  | 			OPENSSL_assert(pointer != NULL); | 
					
						
							| 
									
										
										
										
											2002-12-11 16:33:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-06-20 00:38:27 +08:00
										 |  |  | 			dynlock_lock_callback(mode, pointer, file, line); | 
					
						
							| 
									
										
										
										
											2000-06-19 21:38:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-12-11 16:56:35 +08:00
										 |  |  | 			CRYPTO_destroy_dynlockid(type); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2000-06-18 23:59:04 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		if (locking_callback != NULL) | 
					
						
							|  |  |  | 			locking_callback(mode,type,file,line); | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-04-20 05:31:43 +08:00
										 |  |  | int CRYPTO_add_lock(int *pointer, int amount, int type, const char *file, | 
					
						
							|  |  |  | 	     int line) | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2000-06-18 23:59:04 +08:00
										 |  |  | 	int ret = 0; | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (add_lock_callback != NULL) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | #ifdef LOCK_DEBUG
 | 
					
						
							|  |  |  | 		int before= *pointer; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-06-19 21:38:09 +08:00
										 |  |  | 		ret=add_lock_callback(pointer,amount,type,file,line); | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | #ifdef LOCK_DEBUG
 | 
					
						
							|  |  |  | 		fprintf(stderr,"ladd:%08lx:%2d+%2d->%2d %-18s %s:%d\n", | 
					
						
							|  |  |  | 			CRYPTO_thread_id(), | 
					
						
							|  |  |  | 			before,amount,ret, | 
					
						
							|  |  |  | 			CRYPTO_get_lock_name(type), | 
					
						
							|  |  |  | 			file,line); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		CRYPTO_lock(CRYPTO_LOCK|CRYPTO_WRITE,type,file,line); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		ret= *pointer+amount; | 
					
						
							|  |  |  | #ifdef LOCK_DEBUG
 | 
					
						
							|  |  |  | 		fprintf(stderr,"ladd:%08lx:%2d+%2d->%2d %-18s %s:%d\n", | 
					
						
							|  |  |  | 			CRYPTO_thread_id(), | 
					
						
							|  |  |  | 			*pointer,amount,ret, | 
					
						
							|  |  |  | 			CRYPTO_get_lock_name(type), | 
					
						
							|  |  |  | 			file,line); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 		*pointer=ret; | 
					
						
							|  |  |  | 		CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_WRITE,type,file,line); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	return(ret); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-04-20 05:31:43 +08:00
										 |  |  | const char *CRYPTO_get_lock_name(int type) | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											1998-12-21 18:56:39 +08:00
										 |  |  | 	if (type < 0) | 
					
						
							| 
									
										
										
										
											2000-06-18 23:59:04 +08:00
										 |  |  | 		return("dynamic"); | 
					
						
							| 
									
										
										
										
											1998-12-21 18:56:39 +08:00
										 |  |  | 	else if (type < CRYPTO_NUM_LOCKS) | 
					
						
							|  |  |  | 		return(lock_names[type]); | 
					
						
							| 
									
										
										
										
											2002-11-04 19:30:47 +08:00
										 |  |  | 	else if (type-CRYPTO_NUM_LOCKS > sk_num(app_locks)) | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 		return("ERROR"); | 
					
						
							| 
									
										
										
										
											1998-12-21 18:56:39 +08:00
										 |  |  | 	else | 
					
						
							|  |  |  | 		return(sk_value(app_locks,type-CRYPTO_NUM_LOCKS)); | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef _DLL
 | 
					
						
							| 
									
										
										
										
											2001-02-20 16:13:47 +08:00
										 |  |  | #ifdef OPENSSL_SYS_WIN32
 | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* All we really need to do is remove the 'error' state when a thread
 | 
					
						
							|  |  |  |  * detaches */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-04-20 05:31:43 +08:00
										 |  |  | BOOL WINAPI DLLEntryPoint(HINSTANCE hinstDLL, DWORD fdwReason, | 
					
						
							|  |  |  | 	     LPVOID lpvReserved) | 
					
						
							| 
									
										
										
										
											1998-12-21 18:52:47 +08:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 	switch(fdwReason) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 	case DLL_PROCESS_ATTACH: | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case DLL_THREAD_ATTACH: | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case DLL_THREAD_DETACH: | 
					
						
							|  |  |  | 		ERR_remove_state(0); | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case DLL_PROCESS_DETACH: | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	return(TRUE); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-11-13 23:43:43 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | void OpenSSLDie(const char *file,int line,const char *assertion) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	fprintf(stderr, | 
					
						
							|  |  |  | 		"%s(%d): OpenSSL internal error, assertion failed: %s\n", | 
					
						
							|  |  |  | 		file,line,assertion); | 
					
						
							|  |  |  | 	abort(); | 
					
						
							|  |  |  | 	} |