From f5b2110ac75c7da3d66db4880414b8d2cb83a8c1 Mon Sep 17 00:00:00 2001 From: Pawel Cieslak Date: Thu, 21 Nov 2019 12:43:58 +0100 Subject: [PATCH] Check for limits when setting values from hw config string. Related-To: NEO-3841 Change-Id: I80001a1bc25ae839578b9ca92fd7b32ac664ed6e Signed-off-by: Pawel Cieslak --- runtime/helpers/hw_info.cpp | 21 +++++++++++++++++-- .../os_interface/hw_info_config_tests.cpp | 15 +++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/runtime/helpers/hw_info.cpp b/runtime/helpers/hw_info.cpp index 7fc138ced9..cef1863570 100644 --- a/runtime/helpers/hw_info.cpp +++ b/runtime/helpers/hw_info.cpp @@ -64,16 +64,33 @@ bool setHwInfoValuesFromConfigString(const std::string &hwInfoConfig, HardwareIn return false; } uint32_t sliceCount = static_cast(std::stoul(hwInfoConfig.substr(0, currPos))); + if (sliceCount > std::numeric_limits::max()) { + return false; + } size_t prevPos = currPos + 1; currPos = hwInfoConfig.find('x', prevPos); if (currPos == std::string::npos) { return false; } - uint32_t subSliceCount = sliceCount * static_cast(std::stoul(hwInfoConfig.substr(prevPos, currPos))); + uint32_t subSlicePerSliceCount = static_cast(std::stoul(hwInfoConfig.substr(prevPos, currPos))); + if (subSlicePerSliceCount > std::numeric_limits::max()) { + return false; + } + uint32_t subSliceCount = subSlicePerSliceCount * sliceCount; + if (subSliceCount > std::numeric_limits::max()) { + return false; + } prevPos = currPos + 1; - uint32_t euCount = subSliceCount * static_cast(std::stoul(hwInfoConfig.substr(prevPos, std::string::npos))); + uint32_t euPerSubSliceCount = static_cast(std::stoul(hwInfoConfig.substr(prevPos, std::string::npos))); + if (euPerSubSliceCount > std::numeric_limits::max()) { + return false; + } + uint32_t euCount = euPerSubSliceCount * subSliceCount; + if (euCount > std::numeric_limits::max()) { + return false; + } hwInfoIn.gtSystemInfo.SliceCount = sliceCount; hwInfoIn.gtSystemInfo.SubSliceCount = subSliceCount; diff --git a/unit_tests/os_interface/hw_info_config_tests.cpp b/unit_tests/os_interface/hw_info_config_tests.cpp index b1186b4e99..5e179dc6be 100644 --- a/unit_tests/os_interface/hw_info_config_tests.cpp +++ b/unit_tests/os_interface/hw_info_config_tests.cpp @@ -44,4 +44,19 @@ TEST_F(HwInfoConfigTest, givenInvalidHwInfoSetHwInfoValuesFromConfigString) { success = setHwInfoValuesFromConfigString("1x3", outHwInfo); EXPECT_FALSE(success); + + success = setHwInfoValuesFromConfigString("65536x3x8", outHwInfo); + EXPECT_FALSE(success); + + success = setHwInfoValuesFromConfigString("1x65536x8", outHwInfo); + EXPECT_FALSE(success); + + success = setHwInfoValuesFromConfigString("1x3x65536", outHwInfo); + EXPECT_FALSE(success); + + success = setHwInfoValuesFromConfigString("65535x65535x8", outHwInfo); + EXPECT_FALSE(success); + + success = setHwInfoValuesFromConfigString("1x65535x65535", outHwInfo); + EXPECT_FALSE(success); }