Fix null pointer dereference in SPD

This commit is contained in:
Milan Čermák
2024-12-10 14:37:42 +00:00
committed by Adam Honse
parent 48f0084a9f
commit ae94ce1252
4 changed files with 50 additions and 8 deletions

View File

@@ -1124,7 +1124,7 @@ void ResourceManager::DetectDevicesThreadFunction()
LOG_INFO("------------------------------------------------------");
LOG_INFO("| Detecting I2C DIMM modules |");
LOG_INFO("------------------------------------------------------");
for(unsigned int bus = 0; bus < busses.size(); bus++)
for(unsigned int bus = 0; bus < busses.size() && IsAnyDimmDetectorEnabled(detector_settings); bus++)
{
IF_DRAM_SMBUS(busses[bus]->pci_vendor, busses[bus]->pci_device)
{
@@ -1175,7 +1175,7 @@ void ResourceManager::DetectDevicesThreadFunction()
/*-------------------------------------------------*\
| Update detection percent |
\*-------------------------------------------------*/
percent = ((float)i2c_detector_idx + 1.0f) / percent_denominator;
percent = (i2c_device_detectors.size() + i2c_detector_idx + 1.0f) / percent_denominator;
detection_percent = (unsigned int)(percent * 100.0f);
}
@@ -1223,7 +1223,7 @@ void ResourceManager::DetectDevicesThreadFunction()
/*-------------------------------------------------*\
| Update detection percent |
\*-------------------------------------------------*/
percent = (i2c_device_detectors.size() + i2c_detector_idx + 1.0f) / percent_denominator;
percent = (i2c_device_detectors.size() + i2c_dimm_device_detectors.size() + i2c_detector_idx + 1.0f) / percent_denominator;
detection_percent = (unsigned int)(percent * 100.0f);
}
@@ -1378,7 +1378,7 @@ void ResourceManager::DetectDevicesThreadFunction()
\*-------------------------------------------------*/
hid_device_count++;
percent = (i2c_device_detectors.size() + i2c_pci_device_detectors.size() + hid_device_count) / percent_denominator;
percent = (i2c_device_detectors.size() + i2c_dimm_device_detectors.size() + i2c_pci_device_detectors.size() + hid_device_count) / percent_denominator;
detection_percent = (unsigned int)(percent * 100.0f);
@@ -1491,7 +1491,7 @@ void ResourceManager::DetectDevicesThreadFunction()
\*-------------------------------------------------*/
hid_device_count++;
percent = (i2c_device_detectors.size() + i2c_pci_device_detectors.size() + hid_device_count) / percent_denominator;
percent = (i2c_device_detectors.size() + i2c_dimm_device_detectors.size() + i2c_pci_device_detectors.size() + hid_device_count) / percent_denominator;
detection_percent = percent * 100.0f;
@@ -1729,6 +1729,21 @@ void ResourceManager::UpdateDetectorSettings()
}
}
/*-------------------------------------------------*\
| Loop through all I2C DIMM detectors and see |
| if any need to be saved to the settings |
\*-------------------------------------------------*/
for(unsigned int i2c_detector_idx = 0; i2c_detector_idx < (unsigned int)i2c_dimm_device_detectors.size(); i2c_detector_idx++)
{
detection_string = i2c_dimm_device_detectors[i2c_detector_idx].name.c_str();
if(!(detector_settings.contains("detectors") && detector_settings["detectors"].contains(detection_string)))
{
detector_settings["detectors"][detection_string] = true;
save_settings = true;
}
}
/*-------------------------------------------------*\
| Loop through all I2C PCI detectors and see if any |
| need to be saved to the settings |
@@ -1822,3 +1837,20 @@ void ResourceManager::WaitForDeviceDetection()
DetectDeviceMutex.lock();
DetectDeviceMutex.unlock();
}
bool ResourceManager::IsAnyDimmDetectorEnabled(json &detector_settings)
{
for(unsigned int i2c_detector_idx = 0; i2c_detector_idx < i2c_dimm_device_detectors.size() && detection_is_required.load(); i2c_detector_idx++)
{
detection_string = i2c_dimm_device_detectors[i2c_detector_idx].name.c_str();
/*-------------------------------------------------*\
| Check if this detector is enabled |
\*-------------------------------------------------*/
if(detector_settings.contains("detectors") && detector_settings["detectors"].contains(detection_string) &&
detector_settings["detectors"][detection_string] == false)
{
return false;
}
}
return true;
}