diff options
| author | KiritoDv <kiritodev01@gmail.com> | 2026-05-11 18:27:22 -0600 |
|---|---|---|
| committer | KiritoDv <kiritodev01@gmail.com> | 2026-05-11 18:27:22 -0600 |
| commit | f373d80d3cdb76ac77e9574687f58e303936f6f9 (patch) | |
| tree | 3290392885a41f26db49154f418e284bf512bc95 | |
| parent | 54fb665402f2dd5f145f8b3ecb4bed0218709a9e (diff) | |
Added bound validations for audio table factory
| -rw-r--r-- | src/factories/naudio/v1/AudioTableFactory.cpp | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/src/factories/naudio/v1/AudioTableFactory.cpp b/src/factories/naudio/v1/AudioTableFactory.cpp index 72f1f65..a41bad1 100644 --- a/src/factories/naudio/v1/AudioTableFactory.cpp +++ b/src/factories/naudio/v1/AudioTableFactory.cpp @@ -140,15 +140,21 @@ std::optional<std::shared_ptr<IParsedData>> AudioTableFactory::parse(std::vector if (type == AudioTableType::FONT_TABLE) { auto explicitSamples = Companion::Instance->GetNodesByType("NAUDIO:V1:SAMPLE"); if (explicitSamples.has_value()) { + auto& fontBuf = AudioContext::tables[AudioTableType::FONT_TABLE].buffer; for (auto& [path, node] : explicitSamples.value()) { - auto sampleOffset = GetSafeNode<uint32_t>(node, "offset"); - auto sampleBankId = GetSafeNode<uint32_t>(node, "sampleBankId"); + auto sampleOffset = GetSafeNode<uint32_t>(node, "offset"); + auto sampleBankId = GetSafeNode<uint32_t>(node, "sampleBankId"); // Read physical sampleAddr (second u32 in the Sample struct) from // the font-table buffer. flags is first, sampleAddr is second. + if (sampleOffset + 8 > fontBuf.size()) { + continue; + } auto sReader = AudioContext::MakeReader(AudioTableType::FONT_TABLE, sampleOffset); sReader.ReadUInt32(); // skip flags uint32_t sampleAddr = sReader.ReadUInt32(); - if (sampleAddr == 0) continue; + if (sampleAddr == 0) { + continue; + } uint64_t key = ((uint64_t)sampleBankId << 32) | (uint64_t)sampleAddr; AudioContext::sampleDedup[key] = path; } |
