Continuation of D147432 and D147444. Differential Revision: https://reviews.llvm.org/D150267
99 lines
3.1 KiB
C++
99 lines
3.1 KiB
C++
#include "sanitizer\allocator_interface.h"
|
|
#include <cassert>
|
|
#include <stdio.h>
|
|
#include <windows.h>
|
|
|
|
// RUN: %clang_cl_asan %s -o%t
|
|
// RUN: %env_asan_opts=windows_hook_rtl_allocators=true %run %t 2>&1 | FileCheck %s
|
|
// UNSUPPORTED: asan-64-bits
|
|
|
|
using AllocateFunctionPtr = PVOID(__stdcall *)(PVOID, ULONG, SIZE_T);
|
|
using ReAllocateFunctionPtr = PVOID(__stdcall *)(PVOID, ULONG, PVOID, SIZE_T);
|
|
|
|
using FreeFunctionPtr = PVOID(__stdcall *)(PVOID, ULONG, PVOID);
|
|
|
|
int main() {
|
|
HMODULE NtDllHandle = GetModuleHandle("ntdll.dll");
|
|
if (!NtDllHandle) {
|
|
puts("Couldn't load ntdll??");
|
|
return -1;
|
|
}
|
|
|
|
auto RtlAllocateHeap_ptr = (AllocateFunctionPtr)GetProcAddress(NtDllHandle, "RtlAllocateHeap");
|
|
if (RtlAllocateHeap_ptr == 0) {
|
|
puts("Couldn't find RtlAllocateHeap");
|
|
return -1;
|
|
}
|
|
|
|
auto RtlReAllocateHeap_ptr = (ReAllocateFunctionPtr)GetProcAddress(NtDllHandle, "RtlReAllocateHeap");
|
|
if (RtlReAllocateHeap_ptr == 0) {
|
|
puts("Couldn't find RtlReAllocateHeap");
|
|
return -1;
|
|
}
|
|
|
|
//owned by rtl
|
|
void *alloc = RtlAllocateHeap_ptr(GetProcessHeap(),
|
|
HEAP_GENERATE_EXCEPTIONS | HEAP_ZERO_MEMORY, 100);
|
|
assert(alloc);
|
|
for (int i = 0; i < 100; i++) {
|
|
assert(((char *)alloc)[i] == 0);
|
|
((char *)alloc)[i] = '\xcc';
|
|
}
|
|
|
|
// still owned by rtl
|
|
alloc = RtlReAllocateHeap_ptr(GetProcessHeap(),
|
|
HEAP_GENERATE_EXCEPTIONS | HEAP_ZERO_MEMORY, alloc, 500);
|
|
assert(alloc && !__sanitizer_get_ownership(alloc) && HeapValidate(GetProcessHeap(), 0, alloc));
|
|
for (int i = 0; i < 100; i++) {
|
|
assert(((char *)alloc)[i] == '\xcc');
|
|
}
|
|
for (int i = 100; i < 500; i++) {
|
|
assert(((char *)alloc)[i] == 0);
|
|
((char *)alloc)[i] = '\xcc';
|
|
}
|
|
|
|
//convert to asan owned
|
|
void *realloc = RtlReAllocateHeap_ptr(GetProcessHeap(),
|
|
HEAP_ZERO_MEMORY, alloc, 600);
|
|
alloc = nullptr;
|
|
assert(realloc && __sanitizer_get_ownership(realloc));
|
|
|
|
for (int i = 0; i < 500; i++) {
|
|
assert(((char *)realloc)[i] == '\xcc');
|
|
}
|
|
for (int i = 500; i < 600; i++) {
|
|
assert(((char *)realloc)[i] == 0);
|
|
((char *)realloc)[i] = '\xcc';
|
|
}
|
|
realloc = RtlReAllocateHeap_ptr(GetProcessHeap(),
|
|
HEAP_ZERO_MEMORY, realloc, 2048);
|
|
assert(realloc && __sanitizer_get_ownership(realloc));
|
|
|
|
for (int i = 0; i < 600; i++) {
|
|
assert(((char *)realloc)[i] == '\xcc');
|
|
}
|
|
for (int i = 600; i < 2048; i++) {
|
|
assert(((char *)realloc)[i] == 0);
|
|
((char *)realloc)[i] = '\xcc';
|
|
}
|
|
//convert back to rtl owned;
|
|
alloc = RtlReAllocateHeap_ptr(GetProcessHeap(),
|
|
HEAP_ZERO_MEMORY | HEAP_GENERATE_EXCEPTIONS, realloc, 100);
|
|
assert(alloc && !__sanitizer_get_ownership(alloc) && HeapValidate(GetProcessHeap(), 0, alloc));
|
|
for (int i = 0; i < 100; i++) {
|
|
assert(((char *)alloc)[i] == '\xcc');
|
|
((char *)alloc)[i] = 0;
|
|
}
|
|
|
|
auto usable_size = HeapSize(GetProcessHeap(), 0, alloc);
|
|
for (int i = 100; i < usable_size; i++) {
|
|
assert(((char *)alloc)[i] == 0);
|
|
}
|
|
|
|
printf("Success\n");
|
|
}
|
|
|
|
// CHECK-NOT: Assertion failed:
|
|
// CHECK-NOT: AddressSanitizer
|
|
// CHECK: Success
|