NVMeBasicContext: Catch FileHandle out-of-range exception In execBasicQuery, when the i2c bus path of the nvme sensor does not exist, it still does file handling and causes FileHandle class to throw out-of-range exception and terminate the service. This leads to coredump for the system which is undesirable. This commit adds a try catch to this action of handle i2c bus path, which will log an error message and return when it fails to open the i2c bus path. Signed-off-by: chaul.ampere <chaul@amperecomputing.com> Change-Id: Ice1d363a6149607bd149b89f70f2a23812df999d
diff --git a/src/NVMeBasicContext.cpp b/src/NVMeBasicContext.cpp index 322c133..465f177 100644 --- a/src/NVMeBasicContext.cpp +++ b/src/NVMeBasicContext.cpp
@@ -63,40 +63,51 @@ { int32_t size = 0; std::filesystem::path devpath = "/dev/i2c-" + std::to_string(bus); - FileHandle fileHandle(devpath); - /* Select the target device */ - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg) - if (::ioctl(fileHandle.handle(), I2C_SLAVE, addr) == -1) + try { - std::cerr << "Failed to configure device address 0x" << std::hex - << (int)addr << " for bus " << std::dec << bus << ": " - << strerror(errno) << "\n"; - return; + FileHandle fileHandle(devpath); + + /* Select the target device */ + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg) + if (::ioctl(fileHandle.handle(), I2C_SLAVE, addr) == -1) + { + std::cerr << "Failed to configure device address 0x" << std::hex + << (int)addr << " for bus " << std::dec << bus << ": " + << strerror(errno) << "\n"; + resp.resize(0); + return; + } + + resp.resize(UINT8_MAX + 1); + + /* Issue the NVMe MI basic command */ + size = i2c_smbus_read_block_data(fileHandle.handle(), cmd, resp.data()); + if (size < 0) + { + std::cerr << "Failed to read block data from device 0x" << std::hex + << (int)addr << " on bus " << std::dec << bus << ": " + << strerror(errno) << "\n"; + resp.resize(0); + } + else if (size > UINT8_MAX + 1) + { + std::cerr << "Unexpected message length from device 0x" << std::hex + << (int)addr << " on bus " << std::dec << bus << ": " + << size << " (" << UINT8_MAX << ")\n"; + resp.resize(0); + } + else + { + resp.resize(size); + } } - - resp.resize(UINT8_MAX + 1); - - /* Issue the NVMe MI basic command */ - size = i2c_smbus_read_block_data(fileHandle.handle(), cmd, resp.data()); - if (size < 0) + catch (const std::out_of_range& e) { - std::cerr << "Failed to read block data from device 0x" << std::hex - << (int)addr << " on bus " << std::dec << bus << ": " - << strerror(errno) << "\n"; + std::cerr << "Failed to create file handle for bus " << std::dec << bus + << ": " << e.what() << "\n"; resp.resize(0); } - else if (size > UINT8_MAX + 1) - { - std::cerr << "Unexpected message length from device 0x" << std::hex - << (int)addr << " on bus " << std::dec << bus << ": " << size - << " (" << UINT8_MAX << ")\n"; - resp.resize(0); - } - else - { - resp.resize(size); - } } static ssize_t processBasicQueryStream(FileHandle& in, FileHandle& out)