Fix $OPENSSL_ia32cap handling. The comment says that an "0x" prefix indicates a hex value. However we always passed PRIu64 as the format specifier for |sscanf|, and |sscanf| isn't documented to handle an 0x prefix expect for "i"-family format specifiers. With |PRIu64|, |sscanf| reads any leading "0x" as just zero. Instead, check for "0x" ourselves and use |PRIx64| if found to parse hex values. Change-Id: Id5ed7009d30902022e5ee640e8931bf1431dedc0 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/38264 Commit-Queue: David Benjamin <davidben@google.com> Reviewed-by: David Benjamin <davidben@google.com>
diff --git a/crypto/cpu-intel.c b/crypto/cpu-intel.c index 832e9d6..cc41fc4 100644 --- a/crypto/cpu-intel.c +++ b/crypto/cpu-intel.c
@@ -123,9 +123,17 @@ // and |out[1]|. See the comment in |OPENSSL_cpuid_setup| about this. static void handle_cpu_env(uint32_t *out, const char *in) { const int invert = in[0] == '~'; - uint64_t v; + const int hex = in[invert] == '0' && in[invert+1] == 'x'; - if (!sscanf(in + invert, "%" PRIu64, &v)) { + int sscanf_result; + uint64_t v; + if (hex) { + sscanf_result = sscanf(in + invert + 2, "%" PRIx64, &v); + } else { + sscanf_result = sscanf(in + invert, "%" PRIu64, &v); + } + + if (!sscanf_result) { return; }