mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 15:24:43 +02:00
8275320: NMT should perform buffer overrun checks
8275320: NMT should perform buffer overrun checks 8275301: Unify C-heap buffer overrun checks into NMT Reviewed-by: simonis, zgu
This commit is contained in:
parent
96e36071b6
commit
cf7adae633
11 changed files with 423 additions and 49 deletions
|
@ -669,13 +669,14 @@ void* os::malloc(size_t size, MEMFLAGS memflags, const NativeCallStack& stack) {
|
|||
|
||||
// NMT support
|
||||
NMT_TrackingLevel level = MemTracker::tracking_level();
|
||||
size_t nmt_header_size = MemTracker::malloc_header_size(level);
|
||||
const size_t nmt_overhead =
|
||||
MemTracker::malloc_header_size(level) + MemTracker::malloc_footer_size(level);
|
||||
|
||||
#ifndef ASSERT
|
||||
const size_t alloc_size = size + nmt_header_size;
|
||||
const size_t alloc_size = size + nmt_overhead;
|
||||
#else
|
||||
const size_t alloc_size = GuardedMemory::get_total_size(size + nmt_header_size);
|
||||
if (size + nmt_header_size > alloc_size) { // Check for rollover.
|
||||
const size_t alloc_size = GuardedMemory::get_total_size(size + nmt_overhead);
|
||||
if (size + nmt_overhead > alloc_size) { // Check for rollover.
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
@ -693,7 +694,7 @@ void* os::malloc(size_t size, MEMFLAGS memflags, const NativeCallStack& stack) {
|
|||
return NULL;
|
||||
}
|
||||
// Wrap memory with guard
|
||||
GuardedMemory guarded(ptr, size + nmt_header_size);
|
||||
GuardedMemory guarded(ptr, size + nmt_overhead);
|
||||
ptr = guarded.get_user_ptr();
|
||||
|
||||
if ((intptr_t)ptr == (intptr_t)MallocCatchPtr) {
|
||||
|
@ -741,8 +742,9 @@ void* os::realloc(void *memblock, size_t size, MEMFLAGS memflags, const NativeCa
|
|||
// NMT support
|
||||
NMT_TrackingLevel level = MemTracker::tracking_level();
|
||||
void* membase = MemTracker::record_free(memblock, level);
|
||||
size_t nmt_header_size = MemTracker::malloc_header_size(level);
|
||||
void* ptr = ::realloc(membase, size + nmt_header_size);
|
||||
const size_t nmt_overhead =
|
||||
MemTracker::malloc_header_size(level) + MemTracker::malloc_footer_size(level);
|
||||
void* ptr = ::realloc(membase, size + nmt_overhead);
|
||||
return MemTracker::record_malloc(ptr, size, memflags, stack, level);
|
||||
#else
|
||||
if (memblock == NULL) {
|
||||
|
@ -761,7 +763,10 @@ void* os::realloc(void *memblock, size_t size, MEMFLAGS memflags, const NativeCa
|
|||
if (ptr != NULL ) {
|
||||
GuardedMemory guarded(MemTracker::malloc_base(memblock));
|
||||
// Guard's user data contains NMT header
|
||||
size_t memblock_size = guarded.get_user_size() - MemTracker::malloc_header_size(memblock);
|
||||
NMT_TrackingLevel level = MemTracker::tracking_level();
|
||||
const size_t nmt_overhead =
|
||||
MemTracker::malloc_header_size(level) + MemTracker::malloc_footer_size(level);
|
||||
size_t memblock_size = guarded.get_user_size() - nmt_overhead;
|
||||
memcpy(ptr, memblock, MIN2(size, memblock_size));
|
||||
if (paranoid) {
|
||||
verify_memory(MemTracker::malloc_base(ptr));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue