diff --git a/AK/MemoryStream.h b/AK/MemoryStream.h index f701115ddbc..8b17934010e 100644 --- a/AK/MemoryStream.h +++ b/AK/MemoryStream.h @@ -284,12 +284,14 @@ public: size_t write(ReadonlyBytes bytes) override { + // FIXME: This doesn't write around chunk borders correctly? + size_t nwritten = 0; while (bytes.size() - nwritten > 0) { if ((m_write_offset + nwritten) % chunk_size == 0) m_chunks.append(ByteBuffer::create_uninitialized(chunk_size)); - nwritten += bytes.slice(nwritten).copy_trimmed_to(m_chunks.last().bytes().slice(m_write_offset % chunk_size)); + nwritten += bytes.slice(nwritten).copy_trimmed_to(m_chunks.last().bytes().slice((m_write_offset + nwritten) % chunk_size)); } m_write_offset += nwritten; diff --git a/AK/Tests/TestMemoryStream.cpp b/AK/Tests/TestMemoryStream.cpp index e8cdfa6356d..28be041e3b2 100644 --- a/AK/Tests/TestMemoryStream.cpp +++ b/AK/Tests/TestMemoryStream.cpp @@ -27,6 +27,7 @@ #include #include +#include #include static bool compare(ReadonlyBytes lhs, ReadonlyBytes rhs) @@ -216,4 +217,21 @@ TEST_CASE(unsigned_integer_underflow_regression) stream << buffer; } +TEST_CASE(offset_calculation_error_regression) +{ + Array input, output; + input.span().fill(0xff); + + DuplexMemoryStream stream; + stream << 0x00000000 << input << 0x00000000; + + stream.discard_or_error(sizeof(int)); + stream.read(output); + + EXPECT(compare(input, output)); + + AK::dump_bytes(input); + AK::dump_bytes(output); +} + TEST_MAIN(MemoryStream)