Chromium Code Reviews| Index: chrome/app/chrome_exe_main_mac.cc |
| =================================================================== |
| --- chrome/app/chrome_exe_main_mac.cc (revision 238094) |
| +++ chrome/app/chrome_exe_main_mac.cc (working copy) |
| @@ -5,8 +5,46 @@ |
| // 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 |
| +#endif // ADDRESS_SANITIZER |
| #include <stdlib.h> |
| +#include <string.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; |
| + const int kNaClFlagLen = strlen(kNaClFlag); |
|
Mark Seaborn
2013/12/02 16:51:32
This isn't used
Alexander Potapenko
2013/12/03 09:40:39
Done.
|
| + 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); |
| } // extern "C" |