This is an archive of the discontinued LLVM Phabricator instance.

[ASan][Darwin] Avoid crash during ASan initialization
ClosedPublic

Authored by yln on Dec 23 2021, 2:05 PM.

Details

Summary

Always pass depth=1 to vm_region_recurse_64(). depth is a in-out
parameter and gets reset to 0 after the first call, so we incorrectly
pass depth=0 on subsequent calls.

We want to avoid the following crash:

Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000180000000
Exception Codes: 0x0000000000000001, 0x0000000180000000
VM Region Info: 0x180000000 is not in any region. Bytes after previous region: 277577729 Bytes before following region: 384270336
   REGION TYPE         START - END   [ VSIZE] PRT/MAX SHRMOD REGION DETAIL
   Stack          16f64c000-16f748000 [ 1008K] rw-/rwx SM=PRV thread 0
---> GAP OF 0x27730000 BYTES
   unused shlib __TEXT   196e78000-196eac000 [ 208K] r-x/r-x SM=COW ... this process
Termination Reason: SIGNAL 11 Segmentation fault: 11
Terminating Process: exc handler [767]

Crashing code:

static mach_header *get_dyld_image_header() {
 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 (true) {
  struct vm_region_submap_info_64 info;
  err = vm_region_recurse_64(mach_task_self(), &address, &size, &depth,
                (vm_region_info_t)&info, &count);
  if (err != KERN_SUCCESS) return nullptr;

  if (size >= sizeof(mach_header) && info.protection & kProtectionRead) {
   mach_header *hdr = (mach_header *)address;
   if ((hdr->magic == MH_MAGIC || hdr->magic == MH_MAGIC_64) &&   // << CRASH: sanitizer_procmaps_mac.cpp:176
     hdr->filetype == MH_DYLINKER) {
    return hdr;
   }
  }
  address += size;
 }
}

Radar-Id: rdar://problem/86773501

Diff Detail

Event Timeline

yln requested review of this revision.Dec 23 2021, 2:05 PM
yln created this revision.
Herald added a project: Restricted Project. · View Herald TranscriptDec 23 2021, 2:05 PM
Herald added a subscriber: Restricted Project. · View Herald Transcript
kubamracek accepted this revision.Jan 7 2022, 12:03 PM
This revision is now accepted and ready to land.Jan 7 2022, 12:03 PM
This revision was landed with ongoing or failed builds.Jan 7 2022, 12:28 PM
This revision was automatically updated to reflect the committed changes.