diff --git a/src/Abyss/DataTypes/DC6.cpp b/src/Abyss/DataTypes/DC6.cpp index 2d4fdbd..62b9323 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 db72918..b5154b3 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 6279d95..bb2a0a6 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