[compiler-rt] r300450 - Scan Kernel Alloc Once page for global pointers

Francis Ricci via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 17 07:07:07 PDT 2017


Author: fjricci
Date: Mon Apr 17 09:07:06 2017
New Revision: 300450

URL: http://llvm.org/viewvc/llvm-project?rev=300450&view=rev
Log:
Scan Kernel Alloc Once page for global pointers

Summary: libxpc stashes some pointers here.

Reviewers: kubamracek, alekseyshl

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D32045

Modified:
    compiler-rt/trunk/lib/lsan/lsan_common_mac.cc

Modified: compiler-rt/trunk/lib/lsan/lsan_common_mac.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/lsan/lsan_common_mac.cc?rev=300450&r1=300449&r2=300450&view=diff
==============================================================================
--- compiler-rt/trunk/lib/lsan/lsan_common_mac.cc (original)
+++ compiler-rt/trunk/lib/lsan/lsan_common_mac.cc Mon Apr 17 09:07:06 2017
@@ -22,6 +22,8 @@
 
 #include <pthread.h>
 
+#include <mach/mach.h>
+
 namespace __lsan {
 
 typedef struct {
@@ -113,8 +115,32 @@ void ProcessGlobalRegions(Frontier *fron
   }
 }
 
+// libxpc stashes some pointers in the Kernel Alloc Once page,
+// make sure not to report those as leaks.
 void ProcessPlatformSpecificAllocations(Frontier *frontier) {
-  CHECK(0 && "unimplemented");
+  mach_port_name_t port;
+  if (task_for_pid(mach_task_self(), internal_getpid(), &port)
+      != KERN_SUCCESS) {
+    return;
+  }
+
+  unsigned depth = 1;
+  vm_size_t size = 0;
+  vm_address_t address = 0;
+  kern_return_t err = KERN_SUCCESS;
+  mach_msg_type_number_t count = VM_REGION_SUBMAP_INFO_COUNT_64;
+
+  while (err == KERN_SUCCESS) {
+    struct vm_region_submap_info_64 info;
+    err = vm_region_recurse_64(port, &address, &size, &depth,
+                               (vm_region_info_t)&info, &count);
+    if (info.user_tag == VM_MEMORY_OS_ALLOC_ONCE) {
+      ScanRangeForPointers(address, address + size, frontier,
+                           "GLOBAL", kReachable);
+      return;
+    }
+    address += size;
+  }
 }
 
 void DoStopTheWorld(StopTheWorldCallback callback, void *argument) {




More information about the llvm-commits mailing list