posix: DCHECK for (addr + len) overflow in ScopedMmap::ResetAddrLen()

This also enhances ScopedMmapDeathTest.Mprotect to better ensure that
ScopedMmap::Mprotect() works properly.

Bug: crashpad:30
Test: crashpad_util_test ScopedMmap*.*
Change-Id: Iff35dba9fa993086f3f4cd8f4a862d802e637bb1
Reviewed-on: https://chromium-review.googlesource.com/464547
Reviewed-by: Joshua Peraza <jperaza@chromium.org>
This commit is contained in:
Mark Mentovai 2017-03-31 11:48:41 -04:00
parent aa2bc55777
commit 385fe6615f
2 changed files with 7 additions and 1 deletions

View File

@ -19,6 +19,7 @@
#include <algorithm> #include <algorithm>
#include "base/logging.h" #include "base/logging.h"
#include "base/numerics/safe_math.h"
namespace { namespace {
@ -56,6 +57,7 @@ bool ScopedMmap::ResetAddrLen(void* addr, size_t len) {
DCHECK_NE(len, 0u); DCHECK_NE(len, 0u);
DCHECK_EQ(new_addr % getpagesize(), 0u); DCHECK_EQ(new_addr % getpagesize(), 0u);
DCHECK_EQ(len % getpagesize(), 0u); DCHECK_EQ(len % getpagesize(), 0u);
DCHECK((base::CheckedNumeric<uintptr_t>(new_addr) + (len - 1)).IsValid());
} }
bool result = true; bool result = true;

View File

@ -302,11 +302,15 @@ TEST(ScopedMmapDeathTest, Mprotect) {
EXPECT_EQ(kPageSize, mapping.len()); EXPECT_EQ(kPageSize, mapping.len());
char* addr = mapping.addr_as<char*>(); char* addr = mapping.addr_as<char*>();
*addr = 0; *addr = 1;
ASSERT_TRUE(mapping.Mprotect(PROT_READ)); ASSERT_TRUE(mapping.Mprotect(PROT_READ));
EXPECT_DEATH(*addr = 0, ""); EXPECT_DEATH(*addr = 0, "");
ASSERT_TRUE(mapping.Mprotect(PROT_READ | PROT_WRITE));
EXPECT_EQ(1, *addr);
*addr = 2;
} }
} // namespace } // namespace