[PATCH] D36093: [msan] Check for pvalloc overflow
Kostya Kortchinsky via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 31 08:40:21 PDT 2017
cryptoad created this revision.
`CheckForPvallocOverflow` was introduced with https://reviews.llvm.org/D35818 to detect when pvalloc
would wrap when rounding up to the next multiple of the page size.
Add this check to MSan's pvalloc implementation.
https://reviews.llvm.org/D36093
Files:
lib/msan/msan_allocator.cc
lib/msan/tests/msan_test.cc
Index: lib/msan/tests/msan_test.cc
===================================================================
--- lib/msan/tests/msan_test.cc
+++ lib/msan/tests/msan_test.cc
@@ -3449,6 +3449,17 @@
EXPECT_EQ(0U, (uintptr_t)p % PageSize);
EXPECT_EQ(PageSize, __sanitizer_get_allocated_size(p));
free(p);
+
+ // Overflows in pvalloc should be caught.
+ errno = 0;
+ p = pvalloc((uintptr_t)-PageSize);
+ EXPECT_EQ(p, nullptr);
+ EXPECT_EQ(errno, ENOMEM);
+
+ errno = 0;
+ p = pvalloc((uintptr_t)-1);
+ EXPECT_EQ(p, nullptr);
+ EXPECT_EQ(errno, ENOMEM);
}
#endif
Index: lib/msan/msan_allocator.cc
===================================================================
--- lib/msan/msan_allocator.cc
+++ lib/msan/msan_allocator.cc
@@ -255,8 +255,12 @@
void *msan_pvalloc(uptr size, StackTrace *stack) {
uptr PageSize = GetPageSizeCached();
+ if (UNLIKELY(CheckForPvallocOverflow(size, PageSize))) {
+ errno = errno_ENOMEM;
+ return Allocator::FailureHandler::OnBadRequest();
+ }
// pvalloc(0) should allocate one page.
- size = size == 0 ? PageSize : RoundUpTo(size, PageSize);
+ size = size ? PageSize : RoundUpTo(size, PageSize);
return SetErrnoOnNull(MsanAllocate(stack, size, PageSize, false));
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D36093.108934.patch
Type: text/x-patch
Size: 1232 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170731/909f5cbe/attachment.bin>
More information about the llvm-commits
mailing list