提交 30661b1b 编写于 作者: D Dr. Stephen Henson

Add missing lock definitions.

上级 1ea6472e
...@@ -165,7 +165,9 @@ static const char* const lock_names[CRYPTO_NUM_LOCKS] = ...@@ -165,7 +165,9 @@ static const char* const lock_names[CRYPTO_NUM_LOCKS] =
"ec_pre_comp", "ec_pre_comp",
"store", "store",
"comp", "comp",
#if CRYPTO_NUM_LOCKS != 39 "fips",
"fips2",
#if CRYPTO_NUM_LOCKS != 41
# error "Inconsistency between crypto.h and cryptlib.c" # error "Inconsistency between crypto.h and cryptlib.c"
#endif #endif
}; };
...@@ -552,6 +554,14 @@ unsigned long CRYPTO_thread_id(void) ...@@ -552,6 +554,14 @@ unsigned long CRYPTO_thread_id(void)
} }
#endif #endif
static void (*do_dynlock_cb)(int mode, int type, const char *file, int line);
void int_CRYPTO_set_do_dynlock_callback(
void (*dyn_cb)(int mode, int type, const char *file, int line))
{
do_dynlock_cb = dyn_cb;
}
void CRYPTO_lock(int mode, int type, const char *file, int line) void CRYPTO_lock(int mode, int type, const char *file, int line)
{ {
#ifdef LOCK_DEBUG #ifdef LOCK_DEBUG
...@@ -581,17 +591,8 @@ void CRYPTO_lock(int mode, int type, const char *file, int line) ...@@ -581,17 +591,8 @@ void CRYPTO_lock(int mode, int type, const char *file, int line)
#endif #endif
if (type < 0) if (type < 0)
{ {
if (dynlock_lock_callback != NULL) if (do_dynlock_cb)
{ do_dynlock_cb(mode, type, file, line);
struct CRYPTO_dynlock_value *pointer
= CRYPTO_get_dynlock_value(type);
OPENSSL_assert(pointer != NULL);
dynlock_lock_callback(mode, pointer, file, line);
CRYPTO_destroy_dynlockid(type);
}
} }
else else
if (locking_callback != NULL) if (locking_callback != NULL)
...@@ -693,6 +694,62 @@ void OPENSSL_cpuid_setup(void) {} ...@@ -693,6 +694,62 @@ void OPENSSL_cpuid_setup(void) {}
#endif #endif
#if (defined(_WIN32) || defined(__CYGWIN__)) && defined(_WINDLL) #if (defined(_WIN32) || defined(__CYGWIN__)) && defined(_WINDLL)
#ifdef OPENSSL_FIPS
#include <tlhelp32.h>
#if defined(__GNUC__) && __GNUC__>=2
static int DllInit(void) __attribute__((constructor));
#elif defined(_MSC_VER)
static int DllInit(void);
# ifdef _WIN64
# pragma section(".CRT$XCU",read)
__declspec(allocate(".CRT$XCU"))
# else
# pragma data_seg(".CRT$XCU")
# endif
static int (*p)(void) = DllInit;
# pragma data_seg()
#endif
static int DllInit(void)
{
#if defined(_WIN32_WINNT)
union { int(*f)(void); BYTE *p; } t = { DllInit };
HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
IMAGE_DOS_HEADER *dos_header;
IMAGE_NT_HEADERS *nt_headers;
MODULEENTRY32 me32 = {sizeof(me32)};
hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,0);
if (hModuleSnap != INVALID_HANDLE_VALUE &&
Module32First(hModuleSnap,&me32)) do
{
if (t.p >= me32.modBaseAddr &&
t.p < me32.modBaseAddr+me32.modBaseSize)
{
dos_header=(IMAGE_DOS_HEADER *)me32.modBaseAddr;
if (dos_header->e_magic==IMAGE_DOS_SIGNATURE)
{
nt_headers=(IMAGE_NT_HEADERS *)
((BYTE *)dos_header+dos_header->e_lfanew);
if (nt_headers->Signature==IMAGE_NT_SIGNATURE &&
me32.modBaseAddr!=(BYTE*)nt_headers->OptionalHeader.ImageBase)
OPENSSL_NONPIC_relocated=1;
}
break;
}
} while (Module32Next(hModuleSnap,&me32));
if (hModuleSnap != INVALID_HANDLE_VALUE)
CloseHandle(hModuleSnap);
#endif
OPENSSL_cpuid_setup();
return 0;
}
#else
#ifdef __CYGWIN__ #ifdef __CYGWIN__
/* pick DLL_[PROCESS|THREAD]_[ATTACH|DETACH] definitions */ /* pick DLL_[PROCESS|THREAD]_[ATTACH|DETACH] definitions */
#include <windows.h> #include <windows.h>
...@@ -736,6 +793,8 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, ...@@ -736,6 +793,8 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason,
} }
#endif #endif
#endif
#if defined(_WIN32) && !defined(__CYGWIN__) #if defined(_WIN32) && !defined(__CYGWIN__)
#include <tchar.h> #include <tchar.h>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册