Index: chrome/app/chrome_exe_main_mac.cc |
diff --git a/chrome/app/chrome_exe_main_mac.cc b/chrome/app/chrome_exe_main_mac.cc |
index 83a5c7c6c8d511cdfd6fee838ad43594208719b5..a0f1ac589e17e1ce165a991d01b5490140755f9e 100644 |
--- a/chrome/app/chrome_exe_main_mac.cc |
+++ b/chrome/app/chrome_exe_main_mac.cc |
@@ -5,7 +5,44 @@ |
// The entry point for all Mac Chromium processes, including the outer app |
// bundle (browser) and helper app (renderer, plugin, and friends). |
+#if defined(ADDRESS_SANITIZER) |
+#include <crt_externs.h> // for _NSGetArgc, _NSGetArgv |
+#include <string.h> |
+#endif // ADDRESS_SANITIZER |
#include <stdlib.h> |
+ |
+#if defined(ADDRESS_SANITIZER) |
+// NaCl requires its own SEGV handler, so we need to add handle_segv=0 to |
+// ASAN_OPTIONS. This is done by injecting __asan_default_options into the |
+// executable. |
+// Because there's no distinct NaCl executable on OSX, we have to look at the |
+// command line arguments to understand whether the process is a NaCl loader. |
+ |
+static const char kNaClDefaultOptions[] = "handle_segv=0"; |
+static const char kNaClFlag[] = "--type=nacl-loader"; |
+ |
+extern "C" |
+// __asan_default_options() is called at ASan initialization, so it must |
+// not be instrumented with ASan -- thus the "no_sanitize_address" attribute. |
+__attribute__((no_sanitize_address)) |
+// The function isn't referenced from the executable itself. Make sure it isn't |
+// stripped by the linker. |
+__attribute__((used)) |
+__attribute__((visibility("default"))) |
+const char* __asan_default_options() { |
+ char*** argvp = _NSGetArgv(); |
+ int* argcp = _NSGetArgc(); |
+ if (!argvp || !argcp) return NULL; |
+ char** argv = *argvp; |
+ int argc = *argcp; |
+ for (int i = 0; i < argc; ++i) { |
+ if (strcmp(argv[i], kNaClFlag) == 0) { |
+ return kNaClDefaultOptions; |
+ } |
+ } |
+ return NULL; |
+} |
+#endif // ADDRESS_SANITIZER |
extern "C" { |
int ChromeMain(int argc, char** argv); |