Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(756)

Unified Diff: snapshot/mac/mach_o_image_segment_reader.cc

Issue 1019243006: Tolerate weird cl_kernels modules (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@master
Patch Set: Check the Mach-O file type too Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « snapshot/mac/mach_o_image_segment_reader.h ('k') | snapshot/mac/process_reader_test.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: snapshot/mac/mach_o_image_segment_reader.cc
diff --git a/snapshot/mac/mach_o_image_segment_reader.cc b/snapshot/mac/mach_o_image_segment_reader.cc
index 697822296bacbeb427c15976ae55136cfb5c6efb..6adcd6f2ef56a36da7949730793fec6197ccd554 100644
--- a/snapshot/mac/mach_o_image_segment_reader.cc
+++ b/snapshot/mac/mach_o_image_segment_reader.cc
@@ -20,6 +20,7 @@
#include "base/strings/stringprintf.h"
#include "snapshot/mac/process_reader.h"
#include "util/mac/checked_mach_address_range.h"
+#include "util/mac/mac_util.h"
#include "util/stdlib/strnlen.h"
namespace crashpad {
@@ -46,7 +47,9 @@ MachOImageSegmentReader::~MachOImageSegmentReader() {
bool MachOImageSegmentReader::Initialize(ProcessReader* process_reader,
mach_vm_address_t load_command_address,
- const std::string& load_command_info) {
+ const std::string& load_command_info,
+ const std::string& module_name,
+ uint32_t file_type) {
INITIALIZATION_STATE_SET_INITIALIZING(initialized_);
if (!segment_command_.Read(process_reader, load_command_address)) {
@@ -115,9 +118,29 @@ bool MachOImageSegmentReader::Initialize(ProcessReader* process_reader,
load_command_info.c_str());
if (section_segment_name != segment_name) {
- LOG(WARNING) << "section.segname incorrect in segment " << segment_name
- << section_info;
- return false;
+ // cl_kernels modules (for OpenCL) aren’t ld output, and they’re formatted
+ // incorrectly on Mac OS X 10.10. They have a single __TEXT segment, but
+ // one of the sections within it claims to belong to the __LD segment.
+ // This mismatch shouldn’t happen. This errant section also has the
+ // S_ATTR_DEBUG flag set, which shouldn’t happen unless all of the other
+ // sections in the segment also have this bit set (they don’t). These odd
+ // sections are reminiscent of unwind information stored in MH_OBJECT
+ // images, although cl_kernels images claim to be MH_BUNDLE. Because at
+ // least one cl_kernels module will commonly be found in a process, and
+ // sometimes more will be, tolerate this quirk.
+ //
+ // https://openradar.appspot.com/20239912
+ if (!(file_type == MH_BUNDLE &&
+ module_name == "cl_kernels" &&
+ MacOSXMinorVersion() == 10 &&
+ segment_name == SEG_TEXT &&
+ section_segment_name == "__LD" &&
+ section_name == "__compact_unwind" &&
+ (section.flags & S_ATTR_DEBUG))) {
+ LOG(WARNING) << "section.segname incorrect in segment " << segment_name
+ << section_info;
+ return false;
+ }
}
CheckedMachAddressRange section_range(
« no previous file with comments | « snapshot/mac/mach_o_image_segment_reader.h ('k') | snapshot/mac/process_reader_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698