[PATCH] D25946: [compiler-rt][asan] Add support for desallocation of unhandled pointers

Etienne Bergeron via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 10 08:52:56 PST 2017


etienneb updated this revision to Diff 88007.
etienneb added a comment.

better validation, windows only


https://reviews.llvm.org/D25946

Files:
  lib/asan/asan_allocator.cc
  lib/asan/asan_internal.h
  lib/asan/asan_linux.cc
  lib/asan/asan_mac.cc
  lib/asan/asan_win.cc
  test/asan/TestCases/Windows/virtual_memory.cc


Index: test/asan/TestCases/Windows/virtual_memory.cc
===================================================================
--- /dev/null
+++ test/asan/TestCases/Windows/virtual_memory.cc
@@ -0,0 +1,14 @@
+// RUN: %clang_cl_asan -O0 %s -Fe%t
+// RUN: not %run %t 2>&1 | FileCheck %s
+
+#include <windows.h>
+
+int main() {
+
+  char* buffer = (char*)VirtualAlloc(NULL, 1024, MEM_COMMIT, PAGE_READWRITE);
+  buffer[42] = 42;
+  VirtualFree(buffer, 0, MEM_RELEASE);
+  free(buffer);
+
+// CHECK: AddressSanitizer: attempting free on address which was not malloc()-ed: [[ADDR:0x[0-9a-f]+]] in thread T0
+}
Index: lib/asan/asan_win.cc
===================================================================
--- lib/asan/asan_win.cc
+++ lib/asan/asan_win.cc
@@ -277,6 +277,16 @@
 #endif
 }
 
+bool PlatformIsValidAddress(uptr addr) {
+  MEMORY_BASIC_INFORMATION mem_info = {};
+  if (::VirtualQuery((LPVOID)addr, &mem_info, sizeof(mem_info)) == 0 ||
+      mem_info.State == MEM_FREE) {
+    return false;
+  }
+
+  return true;
+}
+
 // We want to install our own exception handler (EH) to print helpful reports
 // on access violations and whatnot.  Unfortunately, the CRT initializers assume
 // they are run before any user code and drop any previously-installed EHs on
Index: lib/asan/asan_mac.cc
===================================================================
--- lib/asan/asan_mac.cc
+++ lib/asan/asan_mac.cc
@@ -48,6 +48,7 @@
 
 void InitializePlatformInterceptors() {}
 void InitializePlatformExceptionHandlers() {}
+bool PlatformIsValidAddress(uptr addr) { return false; }
 
 // No-op. Mac does not support static linkage anyway.
 void *AsanDoesNotSupportStaticLinkage() {
Index: lib/asan/asan_linux.cc
===================================================================
--- lib/asan/asan_linux.cc
+++ lib/asan/asan_linux.cc
@@ -70,6 +70,7 @@
 
 void InitializePlatformInterceptors() {}
 void InitializePlatformExceptionHandlers() {}
+bool PlatformIsValidAddress(uptr addr) { return false; }
 
 void *AsanDoesNotSupportStaticLinkage() {
   // This will fail to link with -static.
Index: lib/asan/asan_internal.h
===================================================================
--- lib/asan/asan_internal.h
+++ lib/asan/asan_internal.h
@@ -64,6 +64,7 @@
 
 // asan_win.cc
 void InitializePlatformExceptionHandlers();
+bool PlatformIsValidAddress(uptr addr);
 
 // asan_rtl.cc
 void NORETURN ShowStatsAndAbort();
Index: lib/asan/asan_allocator.cc
===================================================================
--- lib/asan/asan_allocator.cc
+++ lib/asan/asan_allocator.cc
@@ -554,7 +554,16 @@
     uptr chunk_beg = p - kChunkHeaderSize;
     AsanChunk *m = reinterpret_cast<AsanChunk *>(chunk_beg);
 
+    // On windows, some DLL may allocate memory before HeapAlloc is hooked.
+    if (SANITIZER_WINDOWS &&
+        !get_allocator().PointerIsMine(ptr)) {
+      if (!PlatformIsValidAddress(p))
+        ReportFreeNotMalloced(p, stack);
+      return;
+    }
+
     ASAN_FREE_HOOK(ptr);
+
     // Must mark the chunk as quarantined before any changes to its metadata.
     // Do not quarantine given chunk if we failed to set CHUNK_QUARANTINE flag.
     if (!AtomicallySetQuarantineFlagIfAllocated(m, ptr, stack)) return;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D25946.88007.patch
Type: text/x-patch
Size: 3230 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170210/642bb020/attachment.bin>


More information about the llvm-commits mailing list