From be5f780977498f217ebd1d13c452aba2f717b5fb Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Sat, 11 Feb 2017 19:27:49 +0300 Subject: [PATCH] fs::memory_stream fixed seek() allows any offset read() cannot overflow --- Utilities/File.cpp | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/Utilities/File.cpp b/Utilities/File.cpp index 503a473ca2..f3940410ca 100644 --- a/Utilities/File.cpp +++ b/Utilities/File.cpp @@ -933,36 +933,42 @@ fs::file::file(const void* ptr, std::size_t size) fs::stat_t stat() override { - fmt::throw_exception("Not supported" HERE); + fmt::raw_error("fs::file::memory_stream::stat(): not supported"); } bool trunc(u64 length) override { - fmt::throw_exception("Not allowed" HERE); + return false; } u64 read(void* buffer, u64 count) override { - const u64 start = m_pos; - const u64 end = seek(count, fs::seek_cur); - if (end < start) fmt::throw_exception("Stream overflow" HERE); - const u64 read_size = end - start; - std::memcpy(buffer, m_ptr + start, read_size); - return read_size; + if (m_pos < m_size) + { + // Get readable size + if (const u64 result = std::min(count, m_size - m_pos)) + { + std::memcpy(buffer, m_ptr + m_pos, result); + m_pos += result; + return result; + } + } + + return 0; } u64 write(const void* buffer, u64 count) override { - fmt::throw_exception("Not allowed" HERE); + return 0; } u64 seek(s64 offset, fs::seek_mode whence) override { return - whence == fs::seek_set ? m_pos = std::min(offset, m_size) : - whence == fs::seek_cur ? m_pos = std::min(offset + m_pos, m_size) : - whence == fs::seek_end ? m_pos = std::min(offset + m_size, m_size) : - (fmt::throw_exception("Invalid whence (0x%x)" HERE, whence), 0); + whence == fs::seek_set ? m_pos = offset : + whence == fs::seek_cur ? m_pos = offset + m_pos : + whence == fs::seek_end ? m_pos = offset + m_size : + (fmt::raw_error("fs::file::memory_stream::seek(): invalid whence"), 0); } u64 size() override