8222387: Out-of-bounds access to CPU _family_id_xxx array

Reviewed-by: dholmes, kvn
This commit is contained in:
Jinke Fan 2019-04-14 21:40:07 +00:00 committed by David Holmes
parent 6f032ffbb5
commit 7abe899912
2 changed files with 27 additions and 11 deletions

View File

@ -43,10 +43,10 @@ typedef enum {
CPU_FAMILY_PENTIUM_4 = 0xF CPU_FAMILY_PENTIUM_4 = 0xF
} FamilyFlag; } FamilyFlag;
typedef enum { typedef enum {
RDTSCP_FLAG = 0x08000000, // bit 27 RDTSCP_FLAG = 0x08000000, // bit 27
INTEL64_FLAG = 0x20000000 // bit 29 INTEL64_FLAG = 0x20000000 // bit 29
} _featureExtendedEdxFlag; } _featureExtendedEdxFlag;
#define CPUID_STANDARD_FN 0x0 #define CPUID_STANDARD_FN 0x0
#define CPUID_STANDARD_FN_1 0x1 #define CPUID_STANDARD_FN_1 0x1
@ -403,18 +403,21 @@ int VM_Version_Ext::number_of_sockets(void) {
const char* VM_Version_Ext::cpu_family_description(void) { const char* VM_Version_Ext::cpu_family_description(void) {
int cpu_family_id = extended_cpu_family(); int cpu_family_id = extended_cpu_family();
if (is_amd()) { if (is_amd()) {
return _family_id_amd[cpu_family_id]; if (cpu_family_id < ExtendedFamilyIdLength_AMD) {
return _family_id_amd[cpu_family_id];
}
} }
if (is_intel()) { if (is_intel()) {
if (cpu_family_id == CPU_FAMILY_PENTIUMPRO) { if (cpu_family_id == CPU_FAMILY_PENTIUMPRO) {
return cpu_model_description(); return cpu_model_description();
} }
return _family_id_intel[cpu_family_id]; if (cpu_family_id < ExtendedFamilyIdLength_INTEL) {
return _family_id_intel[cpu_family_id];
}
} }
if (is_hygon()) { if (is_hygon()) {
return "Dhyana"; return "Dhyana";
} }
return "Unknown x86"; return "Unknown x86";
} }
@ -705,7 +708,7 @@ jlong VM_Version_Ext::maximum_qualified_cpu_frequency(void) {
return _max_qualified_cpu_frequency; return _max_qualified_cpu_frequency;
} }
const char* const VM_Version_Ext::_family_id_intel[] = { const char* const VM_Version_Ext::_family_id_intel[ExtendedFamilyIdLength_INTEL] = {
"8086/8088", "8086/8088",
"", "",
"286", "286",
@ -724,7 +727,7 @@ const char* const VM_Version_Ext::_family_id_intel[] = {
"Pentium 4" "Pentium 4"
}; };
const char* const VM_Version_Ext::_family_id_amd[] = { const char* const VM_Version_Ext::_family_id_amd[ExtendedFamilyIdLength_AMD] = {
"", "",
"", "",
"", "",
@ -742,6 +745,13 @@ const char* const VM_Version_Ext::_family_id_amd[] = {
"", "",
"Opteron/Athlon64", "Opteron/Athlon64",
"Opteron QC/Phenom" // Barcelona et.al. "Opteron QC/Phenom" // Barcelona et.al.
"",
"",
"",
"",
"",
"",
"Zen"
}; };
// Partially from Intel 64 and IA-32 Architecture Software Developer's Manual, // Partially from Intel 64 and IA-32 Architecture Software Developer's Manual,
// September 2013, Vol 3C Table 35-1 // September 2013, Vol 3C Table 35-1

View File

@ -29,14 +29,20 @@
#include "vm_version_x86.hpp" #include "vm_version_x86.hpp"
class VM_Version_Ext : public VM_Version { class VM_Version_Ext : public VM_Version {
enum {
ExtendedFamilyIdLength_INTEL = 16,
ExtendedFamilyIdLength_AMD = 24
};
private: private:
static const size_t VENDOR_LENGTH; static const size_t VENDOR_LENGTH;
static const size_t CPU_EBS_MAX_LENGTH; static const size_t CPU_EBS_MAX_LENGTH;
static const size_t CPU_TYPE_DESC_BUF_SIZE; static const size_t CPU_TYPE_DESC_BUF_SIZE;
static const size_t CPU_DETAILED_DESC_BUF_SIZE; static const size_t CPU_DETAILED_DESC_BUF_SIZE;
static const char* const _family_id_intel[]; static const char* const _family_id_intel[ExtendedFamilyIdLength_INTEL];
static const char* const _family_id_amd[]; static const char* const _family_id_amd[ExtendedFamilyIdLength_AMD];
static const char* const _brand_id[]; static const char* const _brand_id[];
static const char* const _model_id_pentium_pro[]; static const char* const _model_id_pentium_pro[];