From 0ea1ef29a4595181fcc256b003d66f11a514a449 Mon Sep 17 00:00:00 2001 From: IFAKA Date: Sat, 20 Dec 2025 19:20:54 +0100 Subject: [PATCH] fix: add bounds checks to Epub getter functions - getCumulativeSpineItemSize(): Add bounds check before .at() - getSpineItem(): Handle empty spine case to prevent exception - getTocItem(): Handle empty toc case to prevent exception Uses static fallback objects for reference returns when containers are empty, preventing exceptions from .at(0) on empty vectors. --- lib/Epub/Epub.cpp | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/lib/Epub/Epub.cpp b/lib/Epub/Epub.cpp index a3edac8..8d3e4ad 100644 --- a/lib/Epub/Epub.cpp +++ b/lib/Epub/Epub.cpp @@ -298,10 +298,21 @@ bool Epub::getItemSize(const std::string& itemHref, size_t* size) const { int Epub::getSpineItemsCount() const { return spine.size(); } -size_t Epub::getCumulativeSpineItemSize(const int spineIndex) const { return cumulativeSpineItemSize.at(spineIndex); } +size_t Epub::getCumulativeSpineItemSize(const int spineIndex) const { + if (spineIndex < 0 || spineIndex >= static_cast(cumulativeSpineItemSize.size())) { + Serial.printf("[%lu] [EBP] getCumulativeSpineItemSize index:%d is out of range\n", millis(), spineIndex); + return 0; + } + return cumulativeSpineItemSize.at(spineIndex); +} std::string& Epub::getSpineItem(const int spineIndex) { - if (spineIndex < 0 || spineIndex >= spine.size()) { + static std::string emptyString; + if (spine.empty()) { + Serial.printf("[%lu] [EBP] getSpineItem called but spine is empty\n", millis()); + return emptyString; + } + if (spineIndex < 0 || spineIndex >= static_cast(spine.size())) { Serial.printf("[%lu] [EBP] getSpineItem index:%d is out of range\n", millis(), spineIndex); return spine.at(0).second; } @@ -310,7 +321,12 @@ std::string& Epub::getSpineItem(const int spineIndex) { } EpubTocEntry& Epub::getTocItem(const int tocTndex) { - if (tocTndex < 0 || tocTndex >= toc.size()) { + static EpubTocEntry emptyEntry("", "", "", 0); + if (toc.empty()) { + Serial.printf("[%lu] [EBP] getTocItem called but toc is empty\n", millis()); + return emptyEntry; + } + if (tocTndex < 0 || tocTndex >= static_cast(toc.size())) { Serial.printf("[%lu] [EBP] getTocItem index:%d is out of range\n", millis(), tocTndex); return toc.at(0); }