diff --git a/src/FSHelper.h b/src/FSHelper.h index d407496e7..c484880d8 100644 --- a/src/FSHelper.h +++ b/src/FSHelper.h @@ -46,8 +46,8 @@ class File { size_t size() const { return m_File.size(); } bool isDirectory() { return m_File.isDirectory(); } bool seek(size_t pos) { return m_File.seek(pos); } - bool read(uint8_t* buffer, size_t size) { return m_File.read(buffer, size); } - bool write(const uint8_t* buffer, size_t size) { + size_t read(uint8_t* buffer, size_t size) { return m_File.read(buffer, size); } + size_t write(const uint8_t* buffer, size_t size) { return m_File.write(buffer, size); } void close() { return m_File.close(); } diff --git a/src/configuration/Configuration.cpp b/src/configuration/Configuration.cpp index cadca181b..b944cd076 100644 --- a/src/configuration/Configuration.cpp +++ b/src/configuration/Configuration.cpp @@ -229,10 +229,41 @@ void Configuration::eraseSensors() { void Configuration::loadSensors() { SlimeVR::Utils::forEachFile(DIR_CALIBRATIONS, [&](SlimeVR::Utils::File f) { - SensorConfig sensorConfig; - f.read((uint8_t*)&sensorConfig, sizeof(SensorConfig)); - uint8_t sensorId = strtoul(f.name(), nullptr, 10); + + if (f.size() != sizeof(SensorConfig)) { + m_Logger.warn( + "Skipping incompatible sensor calibration file index %d (size=%u " + "expected=%u)", + sensorId, + static_cast(f.size()), + static_cast(sizeof(SensorConfig)) + ); + return; + } + + SensorConfig sensorConfig{}; + auto bytesRead = f.read((uint8_t*)&sensorConfig, sizeof(SensorConfig)); + if (bytesRead != sizeof(SensorConfig)) { + m_Logger.warn( + "Skipping unreadable sensor calibration file index %d (read=%u " + "expected=%u)", + sensorId, + static_cast(bytesRead), + static_cast(sizeof(SensorConfig)) + ); + return; + } + + if (sensorConfig.type > SensorConfigType::RUNTIME_CALIBRATION) { + m_Logger.warn( + "Skipping sensor calibration file index %d with invalid type=%d", + sensorId, + static_cast(sensorConfig.type) + ); + return; + } + m_Logger.debug( "Found sensor calibration for %s at index %d", calibrationConfigTypeToString(sensorConfig.type),