From ac154d4973d94a0d3c6d582da83646c11bb5d78d Mon Sep 17 00:00:00 2001 From: Roman Dementiev Date: Tue, 22 Jul 2025 20:37:14 +0200 Subject: [PATCH] bugfix: increase CXL port array size and add bounds checking --- src/cpucounters.cpp | 9 ++++++++- src/cpucounters.h | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/cpucounters.cpp b/src/cpucounters.cpp index eaec4f3e..5e92b78a 100644 --- a/src/cpucounters.cpp +++ b/src/cpucounters.cpp @@ -7330,7 +7330,14 @@ ServerUncoreCounterState PCM::getServerUncoreCounterState(uint32 socket) result.UncClocks = getUncoreClocks(socket); - for (size_t p = 0; p < getNumCXLPorts(socket); ++p) + const auto numCXLPorts = getNumCXLPorts(socket); + + assert(numCXLPorts <= result.CXLCMCounter.size() && "Number of CXL ports exceeds CXLCMCounter array size"); + assert(numCXLPorts <= result.CXLDPCounter.size() && "Number of CXL ports exceeds CXLDPCounter array size"); + + const auto maxPorts = (std::min)(numCXLPorts, (std::min)(result.CXLCMCounter.size(), result.CXLDPCounter.size())); + + for (size_t p = 0; p < maxPorts; ++p) { for (int i = 0; i < ServerUncoreCounterState::maxCounters && socket < cxlPMUs.size() && size_t(i) < cxlPMUs[socket][p].first.size(); ++i) { diff --git a/src/cpucounters.h b/src/cpucounters.h index 90b5ecf9..2aafa00c 100644 --- a/src/cpucounters.h +++ b/src/cpucounters.h @@ -3790,7 +3790,7 @@ class ServerUncoreCounterState : public UncoreCounterState maxChannels = 32, maxXPILinks = 6, maxIIOStacks = 16, - maxCXLPorts = 6, + maxCXLPorts = 16, maxCounters = UncorePMU::maxCounters }; enum EventPosition