From c9d5d6813d36a43e3f7060285631a200e061e3c9 Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Thu, 11 Dec 2025 13:03:53 +0100 Subject: [PATCH 1/2] Address Coverity issues in BSA code --- components/bsa/ba2dx10file.cpp | 2 +- components/bsa/ba2file.cpp | 21 ++++++--------------- components/bsa/ba2file.hpp | 6 ++---- components/bsa/ba2gnrlfile.cpp | 2 +- components/bsa/compressedbsafile.cpp | 4 ++-- 5 files changed, 12 insertions(+), 23 deletions(-) diff --git a/components/bsa/ba2dx10file.cpp b/components/bsa/ba2dx10file.cpp index c834ac7692..c90fe6bd55 100644 --- a/components/bsa/ba2dx10file.cpp +++ b/components/bsa/ba2dx10file.cpp @@ -157,7 +157,7 @@ namespace Bsa return std::nullopt; // folder not found uint32_t fileHash = generateHash(fileName); - uint32_t extHash = generateExtensionHash(path.filename()); + uint32_t extHash = generateExtensionHash(path.extension().value()); auto iter = it->second.find({ fileHash, extHash }); if (iter == it->second.end()) return std::nullopt; // file not found diff --git a/components/bsa/ba2file.cpp b/components/bsa/ba2file.cpp index 55d24ef2d7..c8c3ad2cad 100644 --- a/components/bsa/ba2file.cpp +++ b/components/bsa/ba2file.cpp @@ -1,7 +1,5 @@ #include "ba2file.hpp" -#include - namespace Bsa { constexpr const uint32_t crc32table[256] = { 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, @@ -37,29 +35,22 @@ namespace Bsa uint32_t generateHash(std::string_view name) { uint32_t result = 0; - for (auto c : name) + for (unsigned char c : name) { - if (uint8_t(c) > 127) + if (c > 127) continue; if (c == '/') c = '\\'; - result = (result >> 8) ^ crc32table[(result ^ (unsigned)(c)) & 0xFF]; + result = (result >> 8) ^ crc32table[(result ^ c) & 0xFF]; } return result; } - uint32_t generateExtensionHash(VFS::Path::NormalizedView file) + uint32_t generateExtensionHash(std::string_view extension) { - std::string_view extension; - if (const std::size_t pos = Misc::findExtension(file.value()); pos != std::string_view::npos) - { - // ext including . - extension = file.value(); - extension.remove_prefix(pos); - } uint32_t result = 0; - for (size_t i = 0; i < 4 && i < extension.size() - 1; i++) - result |= static_cast(extension[i + 1]) << (8 * i); + for (size_t i = 0; i < 3 && i < extension.size(); i++) + result |= static_cast(extension[i]) << (8 * i); return result; } diff --git a/components/bsa/ba2file.hpp b/components/bsa/ba2file.hpp index cfb2cd11bf..c3ed8f364d 100644 --- a/components/bsa/ba2file.hpp +++ b/components/bsa/ba2file.hpp @@ -2,14 +2,12 @@ #define OPENMW_COMPONENTS_BSA_BA2FILE_HPP #include -#include - -#include +#include namespace Bsa { uint32_t generateHash(std::string_view name); - uint32_t generateExtensionHash(VFS::Path::NormalizedView file); + uint32_t generateExtensionHash(std::string_view extension); enum class BA2Version : std::uint32_t { diff --git a/components/bsa/ba2gnrlfile.cpp b/components/bsa/ba2gnrlfile.cpp index 47bce25d81..6432d663dc 100644 --- a/components/bsa/ba2gnrlfile.cpp +++ b/components/bsa/ba2gnrlfile.cpp @@ -148,7 +148,7 @@ namespace Bsa return FileRecord(); // folder not found, return default which has offset of sInvalidOffset uint32_t fileHash = generateHash(fileName); - uint32_t extHash = generateExtensionHash(path.filename()); + uint32_t extHash = generateExtensionHash(path.extension().value()); auto iter = it->second.find({ fileHash, extHash }); if (iter == it->second.end()) return FileRecord(); // file not found, return default which has offset of sInvalidOffset diff --git a/components/bsa/compressedbsafile.cpp b/components/bsa/compressedbsafile.cpp index 2cfa642b00..c0bc9c52da 100644 --- a/components/bsa/compressedbsafile.cpp +++ b/components/bsa/compressedbsafile.cpp @@ -331,7 +331,7 @@ namespace Bsa { if (str.empty()) return 0; - const auto at = [&](std::size_t i) -> char { + const auto at = [&](std::size_t i) -> unsigned char { const char c = str[i]; if (c == '/') return '\\'; @@ -361,7 +361,7 @@ namespace Bsa else if (extension == ".wav") result |= 0x80000000; uint32_t hash = 0; - for (const auto& c : extension) + for (unsigned char c : extension) hash = hash * 0x1003f + c; result += static_cast(hash) << 32; return result; From 9c8edcc43b08e4dc7bc5236cf7b23e59c96f0ca6 Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Fri, 12 Dec 2025 11:37:02 +0100 Subject: [PATCH 2/2] Increase max ext length to 4 --- components/bsa/ba2file.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bsa/ba2file.cpp b/components/bsa/ba2file.cpp index c8c3ad2cad..673fb5505b 100644 --- a/components/bsa/ba2file.cpp +++ b/components/bsa/ba2file.cpp @@ -49,7 +49,7 @@ namespace Bsa uint32_t generateExtensionHash(std::string_view extension) { uint32_t result = 0; - for (size_t i = 0; i < 3 && i < extension.size(); i++) + for (size_t i = 0; i < 4 && i < extension.size(); i++) result |= static_cast(extension[i]) << (8 * i); return result; }