cryptlib.c: fix logical error.
[openssl.git] / crypto / cryptlib.c
index ec8abdce9aeaa5e8dca3b1637bec898385d406f7..14453491deb15daff06b65b9f1aed93940869788 100644 (file)
@@ -125,7 +125,7 @@ static double SSLeay_MSVC5_hack=0.0; /* and for VC1.5 */
        defined(__INTEL__) || \
        defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || defined(_M_X64)
 
-extern unsigned int  OPENSSL_ia32cap_P[2];
+extern unsigned int  OPENSSL_ia32cap_P[4];
 unsigned int *OPENSSL_ia32cap_loc(void) { return OPENSSL_ia32cap_P; }
 
 #if defined(OPENSSL_CPUID_OBJ) && !defined(OPENSSL_NO_ASM) && !defined(I386_ONLY)
@@ -137,7 +137,7 @@ typedef unsigned long long IA32CAP;
 #endif
 void OPENSSL_cpuid_setup(void)
 { static int trigger=0;
-  IA32CAP OPENSSL_ia32_cpuid(void);
+  IA32CAP OPENSSL_ia32_cpuid(unsigned int *);
   IA32CAP vec;
   char *env;
 
@@ -147,14 +147,25 @@ void OPENSSL_cpuid_setup(void)
     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);
+       if (!sscanf(env+off,"%I64i",&vec)) vec = strtoul(env+off,NULL,0);
 #else
-       if (!sscanf(env+off,"%lli",&vec)) vec = strtoul(env+off,NULL,0);
+       if (!sscanf(env+off,"%lli",(long long *)&vec)) vec = strtoul(env+off,NULL,0);
 #endif
-       if (off) vec = OPENSSL_ia32_cpuid()&~vec;
+       if (off) vec = OPENSSL_ia32_cpuid(OPENSSL_ia32cap_P)&~vec;
+       else if (env[0]==':') vec = OPENSSL_ia32_cpuid(OPENSSL_ia32cap_P);
+
+       OPENSSL_ia32cap_P[2] = 0;
+       if ((env=strchr(env,':'))) {
+           unsigned int vecx;
+           env++;
+           off = (env[0]=='~')?1:0;
+           vecx = strtoul(env+off,NULL,0);
+           if (off)    OPENSSL_ia32cap_P[2] &= ~vecx;
+           else        OPENSSL_ia32cap_P[2] = vecx;
+       }
     }
     else
-       vec = OPENSSL_ia32_cpuid();
+       vec = OPENSSL_ia32_cpuid(OPENSSL_ia32cap_P);
 
     /*
      * |(1<<10) sets a reserved bit to signal that variable
@@ -165,7 +176,7 @@ void OPENSSL_cpuid_setup(void)
     OPENSSL_ia32cap_P[1] = (unsigned int)(vec>>32);
 }
 #else
-unsigned int OPENSSL_ia32cap_P[2];
+unsigned int OPENSSL_ia32cap_P[4];
 #endif
 
 #else