Skip to content

Commit dfeb978

Browse files
committed
Fixed a roll-over on size_t in getNewUninitMemBuffer()
Reviewed By: serge-sans-paille Differential Revision: https://reviews.llvm.org/D121399
1 parent 374bb6d commit dfeb978

File tree

2 files changed

+7
-0
lines changed

2 files changed

+7
-0
lines changed

llvm/lib/Support/MemoryBuffer.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,8 @@ WritableMemoryBuffer::getNewUninitMemBuffer(size_t Size, const Twine &BufferName
286286
StringRef NameRef = BufferName.toStringRef(NameBuf);
287287
size_t AlignedStringLen = alignTo(sizeof(MemBuffer) + NameRef.size() + 1, 16);
288288
size_t RealLen = AlignedStringLen + Size + 1;
289+
if (RealLen <= Size) // Check for rollover.
290+
return nullptr;
289291
char *Mem = static_cast<char*>(operator new(RealLen, std::nothrow));
290292
if (!Mem)
291293
return nullptr;

llvm/unittests/Support/MemoryBufferTest.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,11 @@ TEST_F(MemoryBufferTest, make_new) {
219219
EXPECT_NE(nullptr, Four.get());
220220
for (size_t i = 0; i < 123; ++i)
221221
EXPECT_EQ(0, Four->getBufferStart()[0]);
222+
223+
// uninitialized buffer with rollover size
224+
OwningBuffer Five(
225+
WritableMemoryBuffer::getNewUninitMemBuffer(SIZE_MAX, "huge"));
226+
EXPECT_EQ(nullptr, Five.get());
222227
}
223228

224229
void MemoryBufferTest::testGetOpenFileSlice(bool Reopen) {

0 commit comments

Comments
 (0)