diff options
author | Timothy B. Terriberry <tterribe@xiph.org> | 2022-06-28 22:33:43 -0700 |
---|---|---|
committer | Timothy B. Terriberry <tterribe@xiph.org> | 2022-06-28 22:57:40 -0700 |
commit | 03889ae76dea9c5e63e64df495fd77d613a03a80 (patch) | |
tree | 7c70b403497b0232013063fc7aa4057f15ea1229 /celt | |
parent | ccb42e05cc6eb98a15874b9695361025b3ee17ab (diff) | |
download | opus-03889ae76dea9c5e63e64df495fd77d613a03a80.tar.gz |
Check the return value of __get_cpuid().
This function can fail if CPUID is not supported or the maximum
supported value of EAX is less than the requested one.
Check the return value and explicitly disable all SIMD if it does
fail.
This was happening before implicitly because of the initialization
of info[] to zero, but being explicit about it makes it less likely
someone will break this behavior because they did not realize what
was going on.
Diffstat (limited to 'celt')
-rw-r--r-- | celt/x86/x86cpu.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/celt/x86/x86cpu.c b/celt/x86/x86cpu.c index 080eb25e..accf0676 100644 --- a/celt/x86/x86cpu.c +++ b/celt/x86/x86cpu.c @@ -81,7 +81,12 @@ static void cpuid(unsigned int CPUInfo[4], unsigned int InfoType) ); #endif #elif defined(CPU_INFO_BY_C) - __get_cpuid(InfoType, &(CPUInfo[0]), &(CPUInfo[1]), &(CPUInfo[2]), &(CPUInfo[3])); + if !(__get_cpuid(InfoType, &(CPUInfo[0]), &(CPUInfo[1]), &(CPUInfo[2]), &(CPUInfo[3]))) { + /* Our function cannot fail, but __get_cpuid can. + Returning all zeroes will effectively disable all SIMD, which is + what we want on CPUs that don't support CPUID. */ + CPUInfo[3] = CPUInfo[2] = CPUInfo[1] = CPUInfo[0] = 0; + } #endif } @@ -98,7 +103,7 @@ typedef struct CPU_Feature{ static void opus_cpu_feature_check(CPU_Feature *cpu_feature) { - unsigned int info[4] = {0}; + unsigned int info[4]; unsigned int nIds = 0; cpuid(info, 0); |