From 8140914bb20c852d57a25d6b92f593e5fbaa6ee3 Mon Sep 17 00:00:00 2001 From: Alexey Sokolov Date: Sun, 21 Jan 2024 02:08:05 +0000 Subject: [PATCH] Fix reading broken DC6 again See 811c4523b01f7ed23d959b641b3cb17e6bea6859 for more details Ref #158 --- src/Abyss/DataTypes/DC6.cpp | 6 ++++++ src/Abyss/DataTypes/DC6Frame.cpp | 9 ++------- src/Abyss/DataTypes/DC6Frame.h | 2 -- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/Abyss/DataTypes/DC6.cpp b/src/Abyss/DataTypes/DC6.cpp index 2d4fdbd4..62b93234 100644 --- a/src/Abyss/DataTypes/DC6.cpp +++ b/src/Abyss/DataTypes/DC6.cpp @@ -82,6 +82,9 @@ void DC6::setPalette(const Palette &palette) { const auto &frameData = frame.getFrameData(); while (process) { + if (offset >= frameData.size()) { + throw std::runtime_error("Data overrun while decoding DC6 frame."); + } const auto b = frameData[offset]; offset++; @@ -102,6 +105,9 @@ void DC6::setPalette(const Palette &palette) { } case eScanlineType::RunOfOpaquePixels: { for (auto i = 0; i < static_cast(b); i++) { + if (offset >= frameData.size()) { + throw std::runtime_error("Data overrun while decoding DC6 frame."); + } const auto paletteIndex = static_cast(frameData[offset]); const auto &paletteColor = palette.getEntries()[paletteIndex]; const auto pixel = static_cast(paletteColor.getBlue() << 24 | paletteColor.getGreen() << 16 | paletteColor.getRed() << 8 | 0xFF); diff --git a/src/Abyss/DataTypes/DC6Frame.cpp b/src/Abyss/DataTypes/DC6Frame.cpp index db729182..b5154b35 100644 --- a/src/Abyss/DataTypes/DC6Frame.cpp +++ b/src/Abyss/DataTypes/DC6Frame.cpp @@ -14,11 +14,8 @@ DC6Frame::DC6Frame(Streams::StreamReader &stream) { _nextBlock = stream.readUInt32(); _length = stream.readUInt32(); - _frameData.resize(_length); - stream.readBytes(_frameData); - - _terminator.resize(DC6TerminatorSize); - stream.readBytes(_terminator); + _frameData.resize(_length + DC6TerminatorSize); + stream.readBytes(_frameData); } uint32_t DC6Frame::getFlipped() const { return _flipped; } @@ -39,6 +36,4 @@ uint32_t DC6Frame::getLength() const { return _length; } const std::vector& DC6Frame::getFrameData() const { return _frameData; } -const std::vector& DC6Frame::getTerminator() const { return _terminator; } - } // namespace Abyss::DataTypes diff --git a/src/Abyss/DataTypes/DC6Frame.h b/src/Abyss/DataTypes/DC6Frame.h index 6279d95d..bb2a0a6f 100644 --- a/src/Abyss/DataTypes/DC6Frame.h +++ b/src/Abyss/DataTypes/DC6Frame.h @@ -22,7 +22,6 @@ class DC6Frame { uint32_t _nextBlock{}; uint32_t _length{}; std::vector _frameData{}; - std::vector _terminator{}; public: explicit DC6Frame(Streams::StreamReader& stream); @@ -35,7 +34,6 @@ class DC6Frame { [[nodiscard]] uint32_t getNextBlock() const; [[nodiscard]] uint32_t getLength() const; [[nodiscard]] const std::vector& getFrameData() const; - [[nodiscard]] const std::vector& getTerminator() const; }; } // namespace Abyss::DataTypes