diff options
Diffstat (limited to 'app/openssl/crypto/cryptlib.c')
| -rw-r--r-- | app/openssl/crypto/cryptlib.c | 58 | 
1 files changed, 50 insertions, 8 deletions
diff --git a/app/openssl/crypto/cryptlib.c b/app/openssl/crypto/cryptlib.c index 24fe123e..0b77d8b7 100644 --- a/app/openssl/crypto/cryptlib.c +++ b/app/openssl/crypto/cryptlib.c @@ -409,6 +409,10 @@ int (*CRYPTO_get_add_lock_callback(void))(int *num,int mount,int type,  void CRYPTO_set_locking_callback(void (*func)(int mode,int type,  					      const char *file,int line))  	{ +	/* Calling this here ensures initialisation before any threads +	 * are started. +	 */ +	OPENSSL_init();  	locking_callback=func;  	} @@ -500,7 +504,7 @@ void CRYPTO_THREADID_current(CRYPTO_THREADID *id)  	CRYPTO_THREADID_set_numeric(id, (unsigned long)find_thread(NULL));  #else  	/* For everything else, default to using the address of 'errno' */ -	CRYPTO_THREADID_set_pointer(id, &errno); +	CRYPTO_THREADID_set_pointer(id, (void*)&errno);  #endif  	} @@ -661,28 +665,53 @@ const char *CRYPTO_get_lock_name(int type)  	defined(__INTEL__) || \  	defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || defined(_M_X64) -unsigned long  OPENSSL_ia32cap_P=0; -unsigned long *OPENSSL_ia32cap_loc(void) { return &OPENSSL_ia32cap_P; } +unsigned int  OPENSSL_ia32cap_P[2]; +unsigned long *OPENSSL_ia32cap_loc(void) +{   if (sizeof(long)==4) +	/* +	 * If 32-bit application pulls address of OPENSSL_ia32cap_P[0] +	 * clear second element to maintain the illusion that vector +	 * is 32-bit. +	 */ +	OPENSSL_ia32cap_P[1]=0; +    return (unsigned long *)OPENSSL_ia32cap_P; +}  #if defined(OPENSSL_CPUID_OBJ) && !defined(OPENSSL_NO_ASM) && !defined(I386_ONLY)  #define OPENSSL_CPUID_SETUP +#if defined(_WIN32) +typedef unsigned __int64 IA32CAP; +#else +typedef unsigned long long IA32CAP; +#endif  void OPENSSL_cpuid_setup(void)  { static int trigger=0; -  unsigned long OPENSSL_ia32_cpuid(void); +  IA32CAP OPENSSL_ia32_cpuid(void); +  IA32CAP vec;    char *env;      if (trigger)	return;      trigger=1; -    if ((env=getenv("OPENSSL_ia32cap"))) -	OPENSSL_ia32cap_P = strtoul(env,NULL,0)|(1<<10); +    if ((env=getenv("OPENSSL_ia32cap"))) { +	int off = (env[0]=='~')?1:0; +#if defined(_WIN32) +	if (!sscanf(env+off,"%I64i",&vec)) vec = strtoul(env+off,NULL,0); +#else +	if (!sscanf(env+off,"%lli",(long long *)&vec)) vec = strtoul(env+off,NULL,0); +#endif +	if (off) vec = OPENSSL_ia32_cpuid()&~vec; +    }      else -	OPENSSL_ia32cap_P = OPENSSL_ia32_cpuid()|(1<<10); +	vec = OPENSSL_ia32_cpuid(); +      /*       * |(1<<10) sets a reserved bit to signal that variable       * was initialized already... This is to avoid interference       * with cpuid snippets in ELF .init segment.       */ +    OPENSSL_ia32cap_P[0] = (unsigned int)vec|(1<<10); +    OPENSSL_ia32cap_P[1] = (unsigned int)(vec>>32);  }  #endif @@ -860,7 +889,7 @@ void OPENSSL_showfatal (const char *fmta,...)  #if defined(_WIN32_WINNT) && _WIN32_WINNT>=0x0333      /* this -------------v--- guards NT-specific calls */ -    if (GetVersion() < 0x80000000 && OPENSSL_isservice() > 0) +    if (check_winnt() && OPENSSL_isservice() > 0)      {	HANDLE h = RegisterEventSource(0,_T("OPENSSL"));  	const TCHAR *pmsg=buf;  	ReportEvent(h,EVENTLOG_ERROR_TYPE,0,0,0,1,0,&pmsg,0); @@ -896,3 +925,16 @@ void OpenSSLDie(const char *file,int line,const char *assertion)  	}  void *OPENSSL_stderr(void)	{ return stderr; } + +int CRYPTO_memcmp(const void *in_a, const void *in_b, size_t len) +	{ +	size_t i; +	const unsigned char *a = in_a; +	const unsigned char *b = in_b; +	unsigned char x = 0; + +	for (i = 0; i < len; i++) +		x |= a[i] ^ b[i]; + +	return x; +	}  | 
