diff --git a/components/bsa/bsafile.cpp b/components/bsa/bsafile.cpp index 0d871235be..636fda6b68 100644 --- a/components/bsa/bsafile.cpp +++ b/components/bsa/bsafile.cpp @@ -161,11 +161,11 @@ void BSAFile::readHeader() size_t fileDataOffset = 12 + dirsize + 8 * filenum; // Set up the the FileStruct table - mFiles.resize(filenum); + mFiles.reserve(filenum); size_t endOfNameBuffer = 0; for (size_t i = 0; i < filenum; i++) { - FileStruct& fs = mFiles[i]; + FileStruct& fs = mFiles.emplace_back(); const uint32_t fileSize = offsets[i * 2]; const uint32_t offset = offsets[i * 2 + 1] + static_cast(fileDataOffset); diff --git a/components/bsa/compressedbsafile.cpp b/components/bsa/compressedbsafile.cpp index fbfb72abd3..d47a59e5a7 100644 --- a/components/bsa/compressedbsafile.cpp +++ b/components/bsa/compressedbsafile.cpp @@ -82,9 +82,12 @@ namespace Bsa }; std::vector>> folders; - folders.resize(mHeader.mFolderCount); - for (auto& [folder, filelist] : folders) + folders.reserve(mHeader.mFolderCount); + + for (std::uint32_t i = 0; i < mHeader.mFolderCount; ++i) { + FlatFolderRecord folder; + input.read(reinterpret_cast(&folder.mHash), 8); input.read(reinterpret_cast(&folder.mCount), 4); if (mHeader.mVersion == Version_SSE) // SSE @@ -97,10 +100,12 @@ namespace Bsa { input.read(reinterpret_cast(&folder.mOffset), 4); } - } - if (input.bad()) - fail("Failed to read compressed BSA folder records: input error"); + if (input.fail()) + fail("Failed to read compressed BSA folder records: input error"); + + folders.emplace_back(std::move(folder), std::vector()); + } // file record blocks if ((mHeader.mFlags & ArchiveFlag_FolderNames) == 0) @@ -127,12 +132,20 @@ namespace Bsa mHeader.mFolderNamesLength -= size; } - filelist.resize(folder.mCount); - for (auto& file : filelist) + filelist.reserve(folder.mCount); + + for (std::uint32_t i = 0; i < folder.mCount; ++i) { + FileRecord file; + input.read(reinterpret_cast(&file.mHash), 8); input.read(reinterpret_cast(&file.mSize), 4); input.read(reinterpret_cast(&file.mOffset), 4); + + if (input.fail()) + fail("Failed to read compressed BSA folder file records: input error"); + + filelist.push_back(std::move(file)); } }