diff options
author | Anna Zaks <ganna@apple.com> | 2013-12-19 02:35:26 +0000 |
---|---|---|
committer | Anna Zaks <ganna@apple.com> | 2013-12-19 02:35:26 +0000 |
commit | 386328f96f63424d2b13c46db5dce7d54cb4c611 (patch) | |
tree | cd7ada34b39df56b85028092b459fac831479b47 | |
parent | 2fc7101e3c2bdae65104becd8fd091d85d5ab60f (diff) | |
download | bcm5719-llvm-386328f96f63424d2b13c46db5dce7d54cb4c611.tar.gz bcm5719-llvm-386328f96f63424d2b13c46db5dce7d54cb4c611.zip |
Fix a buffer overrun detected by AddressSanitizer.
llvm-svn: 197647
-rw-r--r-- | llvm/include/llvm/ADT/BitVector.h | 6 | ||||
-rw-r--r-- | llvm/unittests/ADT/BitVectorTest.cpp | 6 |
2 files changed, 10 insertions, 2 deletions
diff --git a/llvm/include/llvm/ADT/BitVector.h b/llvm/include/llvm/ADT/BitVector.h index 8fb538f68fc..6f69aba7c01 100644 --- a/llvm/include/llvm/ADT/BitVector.h +++ b/llvm/include/llvm/ADT/BitVector.h @@ -267,7 +267,8 @@ public: Bits[I / BITWORD_SIZE] = ~0UL; BitWord PostfixMask = (1UL << (E % BITWORD_SIZE)) - 1; - Bits[I / BITWORD_SIZE] |= PostfixMask; + if (I < E) + Bits[I / BITWORD_SIZE] |= PostfixMask; return *this; } @@ -305,7 +306,8 @@ public: Bits[I / BITWORD_SIZE] = 0UL; BitWord PostfixMask = (1UL << (E % BITWORD_SIZE)) - 1; - Bits[I / BITWORD_SIZE] &= ~PostfixMask; + if (I < E) + Bits[I / BITWORD_SIZE] &= ~PostfixMask; return *this; } diff --git a/llvm/unittests/ADT/BitVectorTest.cpp b/llvm/unittests/ADT/BitVectorTest.cpp index d7cde891fb5..3deaff0fe35 100644 --- a/llvm/unittests/ADT/BitVectorTest.cpp +++ b/llvm/unittests/ADT/BitVectorTest.cpp @@ -356,6 +356,12 @@ TYPED_TEST(BitVectorTest, RangeOps) { EXPECT_TRUE( E.test(1)); EXPECT_TRUE( E.test(32)); EXPECT_FALSE(E.test(33)); + + TypeParam BufferOverrun; + unsigned size = sizeof(unsigned long) * 8; + BufferOverrun.resize(size); + BufferOverrun.reset(0, size); + BufferOverrun.set(0, size); } TYPED_TEST(BitVectorTest, CompoundTestReset) { |