From 81d9dfc70d826e9635af6c0eac0c09b0a25c5b76 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Thu, 2 Jun 2016 06:21:44 +0000 Subject: [PATCH] [CodeView] Take the StreamRef::readBytes offset into account when validating We only considered the length of the operation and the length of the StreamRef without considered what it meant for the offset to be at a non-zero position. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@271496 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/DebugInfo/CodeView/StreamRef.h | 2 +- unittests/DebugInfo/PDB/MappedBlockStreamTest.cpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/include/llvm/DebugInfo/CodeView/StreamRef.h b/include/llvm/DebugInfo/CodeView/StreamRef.h index 2242b6783e3..01b19138398 100644 --- a/include/llvm/DebugInfo/CodeView/StreamRef.h +++ b/include/llvm/DebugInfo/CodeView/StreamRef.h @@ -29,7 +29,7 @@ public: Error readBytes(uint32_t Offset, uint32_t Size, ArrayRef &Buffer) const override { - if (Size > Length) + if (Size + Offset > Length) return make_error(cv_error_code::insufficient_buffer); return Stream->readBytes(ViewOffset + Offset, Size, Buffer); } diff --git a/unittests/DebugInfo/PDB/MappedBlockStreamTest.cpp b/unittests/DebugInfo/PDB/MappedBlockStreamTest.cpp index f40ac356a0d..75e954df411 100644 --- a/unittests/DebugInfo/PDB/MappedBlockStreamTest.cpp +++ b/unittests/DebugInfo/PDB/MappedBlockStreamTest.cpp @@ -79,6 +79,8 @@ TEST(MappedBlockStreamTest, ReadBeyondEndOfStreamRef) { EXPECT_NO_ERROR(R.readStreamRef(SR, 0U)); ArrayRef Buffer; EXPECT_ERROR(SR.readBytes(0U, 1U, Buffer)); + EXPECT_NO_ERROR(R.readStreamRef(SR, 1U)); + EXPECT_ERROR(SR.readBytes(1U, 1U, Buffer)); } // Tests that a read which outputs into a full destination buffer works and