summaryrefslogtreecommitdiffstats
path: root/crypto/cryptlib.c
diff options
context:
space:
mode:
authorAndy Polyakov <appro@openssl.org>2017-11-05 20:03:17 +0100
committerAndy Polyakov <appro@openssl.org>2017-11-08 21:45:16 +0100
commitd6ee8f3dc4414cd97bd63b801f8644f0ff8a1f17 (patch)
tree738ea44a85df4e37720dc48a6a9e8fb6da93f415 /crypto/cryptlib.c
parent1b6fa9fdf86fcfd5ce2a84d41388b79e328e14a3 (diff)
OPENSSL_ia32cap: reserve for new extensions.
Reviewed-by: Rich Salz <rsalz@openssl.org>
Diffstat (limited to 'crypto/cryptlib.c')
-rw-r--r--crypto/cryptlib.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/crypto/cryptlib.c b/crypto/cryptlib.c
index eb24b27808..c2bd2193b7 100644
--- a/crypto/cryptlib.c
+++ b/crypto/cryptlib.c
@@ -61,16 +61,26 @@ void OPENSSL_cpuid_setup(void)
}
if ((env = strchr(env, ':'))) {
- unsigned int vecx;
+ IA32CAP 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;
+# if defined(_WIN32)
+ if (!sscanf(env + off, "%I64i", &vecx))
+ vecx = strtoul(env + off, NULL, 0);
+# else
+ if (!sscanf(env + off, "%lli", (long long *)&vecx))
+ vecx = strtoul(env + off, NULL, 0);
+# endif
+ if (off) {
+ OPENSSL_ia32cap_P[2] &= ~(unsigned int)vecx;
+ OPENSSL_ia32cap_P[3] &= ~(unsigned int)(vecx >> 32);
+ } else {
+ OPENSSL_ia32cap_P[2] = (unsigned int)vecx;
+ OPENSSL_ia32cap_P[3] = (unsigned int)(vecx >> 32);
+ }
} else {
OPENSSL_ia32cap_P[2] = 0;
+ OPENSSL_ia32cap_P[3] = 0;
}
} else {
vec = OPENSSL_ia32_cpuid(OPENSSL_ia32cap_P);