| 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);
|
|
|