From 259d786065880a2bdad7dee756182a220e14cfe5 Mon Sep 17 00:00:00 2001 From: Greg Clayton Date: Fri, 20 May 2016 19:18:20 +0000 Subject: [PATCH] Adopt mmap flags that allow mmap'ed memory to be less crash prone. On Darwin if a mmap file is code signed and the code signature is invalid, it used to crash. If we specify the MAP_RESILIENT_CODESIGN mmap flag when mapping a file for reading, we can avoid crashing. Another mmap flag named MAP_RESILIENT_MEDIA allows us to survive if we mmap files that are on removable media like network servers or removable hard drives. If a file was mapped and later the media that had the file became unavailable, we would crash when we would touch the next page that wasn't paged in. Now it will return zeroes and stop of from us from crashing. llvm-svn: 270254 --- lldb/source/Core/DataBufferMemoryMap.cpp | 27 ++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/lldb/source/Core/DataBufferMemoryMap.cpp b/lldb/source/Core/DataBufferMemoryMap.cpp index fd8db63c8a78..48fe9e58d07d 100644 --- a/lldb/source/Core/DataBufferMemoryMap.cpp +++ b/lldb/source/Core/DataBufferMemoryMap.cpp @@ -14,8 +14,29 @@ #include "lldb/Host/windows/windows.h" #else #include -#endif +#define MAP_EXTRA_HOST_READ_FLAGS 0 + +#if defined (__APPLE__) +//---------------------------------------------------------------------- +// Newer versions of MacOSX have a flag that will allow us to read from +// binaries whose code signature is invalid without crashing by using +// the MAP_RESILIENT_CODESIGN flag. Also if a file from removable media +// is mapped we can avoid crashing and return zeroes to any pages we try +// to read if the media becomes unavailable by using the +// MAP_RESILIENT_MEDIA flag. +//---------------------------------------------------------------------- +#if defined(MAP_RESILIENT_CODESIGN) + #undef MAP_EXTRA_HOST_READ_FLAGS + #if defined(MAP_RESILIENT_MEDIA) + #define MAP_EXTRA_HOST_READ_FLAGS MAP_RESILIENT_CODESIGN | MAP_RESILIENT_MEDIA + #else + #define MAP_EXTRA_HOST_READ_FLAGS MAP_RESILIENT_CODESIGN + #endif +#endif // #if defined(MAP_RESILIENT_CODESIGN) +#endif // #if defined (__APPLE__) + +#endif // #else #ifdef _WIN32 // C++ Includes #include #include @@ -255,10 +276,12 @@ DataBufferMemoryMap::MemoryMapFromFileDescriptor (int fd, if (length > 0) { int prot = PROT_READ; + int flags = MAP_PRIVATE; if (writeable) prot |= PROT_WRITE; + else + flags |= MAP_EXTRA_HOST_READ_FLAGS; - int flags = MAP_PRIVATE; if (fd_is_file) flags |= MAP_FILE;