178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//===-- msan.cc -----------------------------------------------------------===// 278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// 378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// The LLVM Compiler Infrastructure 478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// 578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// This file is distributed under the University of Illinois Open Source 678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// License. See LICENSE.TXT for details. 778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// 878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//===----------------------------------------------------------------------===// 978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// 1078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// This file is a part of MemorySanitizer. 1178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// 1278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// MemorySanitizer runtime. 1378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov//===----------------------------------------------------------------------===// 1478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 1578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "msan.h" 162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "msan_chained_origin_depot.h" 172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "msan_origin.h" 182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "msan_thread.h" 1986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#include "msan_poisoning.h" 2078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "sanitizer_common/sanitizer_atomic.h" 2178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "sanitizer_common/sanitizer_common.h" 2278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "sanitizer_common/sanitizer_flags.h" 2386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#include "sanitizer_common/sanitizer_flag_parser.h" 2478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "sanitizer_common/sanitizer_libc.h" 2578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "sanitizer_common/sanitizer_procmaps.h" 2678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "sanitizer_common/sanitizer_stacktrace.h" 2778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov#include "sanitizer_common/sanitizer_symbolizer.h" 282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "sanitizer_common/sanitizer_stackdepot.h" 29cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar#include "ubsan/ubsan_flags.h" 30cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar#include "ubsan/ubsan_init.h" 3178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// ACHTUNG! No system header includes in this file. 3378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovusing namespace __sanitizer; 3578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// Globals. 3778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovstatic THREADLOCAL int msan_expect_umr = 0; 3878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovstatic THREADLOCAL int msan_expected_umr_found = 0; 3978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Function argument shadow. Each argument starts at the next available 8-byte 412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// aligned address. 4278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovSANITIZER_INTERFACE_ATTRIBUTE 436d1862363c88c183b0ed7740fca876342cf0474bStephen HinesTHREADLOCAL u64 __msan_param_tls[kMsanParamTlsSize / sizeof(u64)]; 4478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Function argument origin. Each argument starts at the same offset as the 462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// corresponding shadow in (__msan_param_tls). Slightly weird, but changing this 472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// would break compatibility with older prebuilt binaries. 4878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovSANITIZER_INTERFACE_ATTRIBUTE 496d1862363c88c183b0ed7740fca876342cf0474bStephen HinesTHREADLOCAL u32 __msan_param_origin_tls[kMsanParamTlsSize / sizeof(u32)]; 5078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 5178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovSANITIZER_INTERFACE_ATTRIBUTE 526d1862363c88c183b0ed7740fca876342cf0474bStephen HinesTHREADLOCAL u64 __msan_retval_tls[kMsanRetvalTlsSize / sizeof(u64)]; 5378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 5478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovSANITIZER_INTERFACE_ATTRIBUTE 5578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovTHREADLOCAL u32 __msan_retval_origin_tls; 5678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 5778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovSANITIZER_INTERFACE_ATTRIBUTE 58799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarALIGNED(16) THREADLOCAL u64 __msan_va_arg_tls[kMsanParamTlsSize / sizeof(u64)]; 5978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 6078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovSANITIZER_INTERFACE_ATTRIBUTE 6178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovTHREADLOCAL u64 __msan_va_arg_overflow_size_tls; 6278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 6378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovSANITIZER_INTERFACE_ATTRIBUTE 6478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovTHREADLOCAL u32 __msan_origin_tls; 6578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 6627ee7a8bece46fafe81cd10bc5cb14b7082cb644Evgeniy Stepanovstatic THREADLOCAL int is_in_symbolizer; 6770c6e3fb6dfddb9c4d26ac133beb5f53b71e47d9Kostya Serebryany 68a879f10ee6aa04f6169d056ef2a9c39502fff290Evgeniy Stepanovextern "C" SANITIZER_WEAK_ATTRIBUTE const int __msan_track_origins; 69b36779d6e9c55e97b2258fe30e8e02c416b14ddaEvgeniy Stepanov 7078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovint __msan_get_track_origins() { 71b36779d6e9c55e97b2258fe30e8e02c416b14ddaEvgeniy Stepanov return &__msan_track_origins ? __msan_track_origins : 0; 7278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 7378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 74bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanovextern "C" SANITIZER_WEAK_ATTRIBUTE const int __msan_keep_going; 75bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov 7678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovnamespace __msan { 7778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 7827ee7a8bece46fafe81cd10bc5cb14b7082cb644Evgeniy Stepanovvoid EnterSymbolizer() { ++is_in_symbolizer; } 7927ee7a8bece46fafe81cd10bc5cb14b7082cb644Evgeniy Stepanovvoid ExitSymbolizer() { --is_in_symbolizer; } 8070c6e3fb6dfddb9c4d26ac133beb5f53b71e47d9Kostya Serebryanybool IsInSymbolizer() { return is_in_symbolizer; } 8170c6e3fb6dfddb9c4d26ac133beb5f53b71e47d9Kostya Serebryany 8278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovstatic Flags msan_flags; 8378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 8478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovFlags *flags() { 8578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return &msan_flags; 8678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 8778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 8878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovint msan_inited = 0; 8978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovbool msan_init_is_running; 9078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 9199bf1d71c634ab0ed39d7614fd8f8f2c2201e111Evgeniy Stepanovint msan_report_count = 0; 9299bf1d71c634ab0ed39d7614fd8f8f2c2201e111Evgeniy Stepanov 9378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// Array of stack origins. 9478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// FIXME: make it resizable. 9578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovstatic const uptr kNumStackOriginDescrs = 1024 * 1024; 9678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovstatic const char *StackOriginDescr[kNumStackOriginDescrs]; 976f3460595f10fb4740ccd0beaa888a0e47ed48cdEvgeniy Stepanovstatic uptr StackOriginPC[kNumStackOriginDescrs]; 9878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovstatic atomic_uint32_t NumStackOriginDescrs; 9978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 10086277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesvoid Flags::SetDefaults() { 10186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#define MSAN_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue; 10286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#include "msan_flags.inc" 10386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#undef MSAN_FLAG 10486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines} 10586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 10686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// keep_going is an old name for halt_on_error, 10786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// and it has inverse meaning. 10886277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesclass FlagHandlerKeepGoing : public FlagHandlerBase { 10986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines bool *halt_on_error_; 11086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 11186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines public: 11286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines explicit FlagHandlerKeepGoing(bool *halt_on_error) 11386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines : halt_on_error_(halt_on_error) {} 11486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines bool Parse(const char *value) final { 11586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines bool tmp; 11686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines FlagHandler<bool> h(&tmp); 11786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines if (!h.Parse(value)) return false; 11886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines *halt_on_error_ = !tmp; 11986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines return true; 12086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines } 12186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines}; 12286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 12386277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesstatic void RegisterMsanFlags(FlagParser *parser, Flags *f) { 12486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#define MSAN_FLAG(Type, Name, DefaultValue, Description) \ 12586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines RegisterFlag(parser, #Name, Description, &f->Name); 12686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#include "msan_flags.inc" 12786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#undef MSAN_FLAG 12886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 12986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines FlagHandlerKeepGoing *fh_keep_going = new (FlagParser::Alloc) // NOLINT 13086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines FlagHandlerKeepGoing(&f->halt_on_error); 13186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines parser->RegisterHandler("keep_going", fh_keep_going, 13286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines "deprecated, use halt_on_error"); 13386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines} 13486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 13586277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesstatic void InitializeFlags() { 13686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines SetCommonFlagsDefaults(); 13786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines { 13886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines CommonFlags cf; 13986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines cf.CopyFrom(*common_flags()); 14086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines cf.external_symbolizer_path = GetEnv("MSAN_SYMBOLIZER_PATH"); 14186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines cf.malloc_context_size = 20; 14286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines cf.handle_ioctl = true; 14386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines // FIXME: test and enable. 14486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines cf.check_printf = false; 14586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines cf.intercept_tls_get_addr = true; 146799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar cf.exitcode = 77; 14786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines OverrideCommonFlags(cf); 14886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines } 14986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 150cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar Flags *f = flags(); 15186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines f->SetDefaults(); 15286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 153cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar FlagParser parser; 154cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar RegisterMsanFlags(&parser, f); 155cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar RegisterCommonFlags(&parser); 156cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar 157cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar#if MSAN_CONTAINS_UBSAN 158cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar __ubsan::Flags *uf = __ubsan::flags(); 159cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar uf->SetDefaults(); 160cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar 161cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar FlagParser ubsan_parser; 162cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar __ubsan::RegisterUbsanFlags(&ubsan_parser, uf); 163cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar RegisterCommonFlags(&ubsan_parser); 164cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar#endif 165cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar 16686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines // Override from user-specified string. 16786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines if (__msan_default_options) 16886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines parser.ParseString(__msan_default_options()); 169cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar#if MSAN_CONTAINS_UBSAN 170cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar const char *ubsan_default_options = __ubsan::MaybeCallUbsanDefaultOptions(); 171cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar ubsan_parser.ParseString(ubsan_default_options); 172cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar#endif 17386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 17486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines const char *msan_options = GetEnv("MSAN_OPTIONS"); 17586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines parser.ParseString(msan_options); 176cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar#if MSAN_CONTAINS_UBSAN 177cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar ubsan_parser.ParseString(GetEnv("UBSAN_OPTIONS")); 178cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar#endif 17986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines VPrintf(1, "MSAN_OPTIONS: %s\n", msan_options ? msan_options : "<empty>"); 18086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 181c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar InitializeCommonFlags(); 18286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 18386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines if (Verbosity()) ReportUnrecognizedFlags(); 18486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 18586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines if (common_flags()->help) parser.PrintFlagDescriptions(); 18686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 187799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar // Check if deprecated exit_code MSan flag is set. 188799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar if (f->exit_code != -1) { 189799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar if (Verbosity()) 190799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar Printf("MSAN_OPTIONS=exit_code is deprecated! " 191799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar "Please use MSAN_OPTIONS=exitcode instead.\n"); 192799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar CommonFlags cf; 193799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar cf.CopyFrom(*common_flags()); 194799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar cf.exitcode = f->exit_code; 195799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar OverrideCommonFlags(cf); 19678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 197799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar 198799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar // Check flag values: 1992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (f->origin_history_size < 0 || 2002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines f->origin_history_size > Origin::kMaxDepth) { 2012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines Printf( 2022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "Origin history size invalid: %d. Must be 0 (unlimited) or in [1, %d] " 2032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "range.\n", 2042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines f->origin_history_size, Origin::kMaxDepth); 2052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines Die(); 2062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 2072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // Limiting to kStackDepotMaxUseCount / 2 to avoid overflow in 2082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // StackDepotHandle::inc_use_count_unsafe. 2092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (f->origin_history_per_stack_limit < 0 || 2102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines f->origin_history_per_stack_limit > kStackDepotMaxUseCount / 2) { 2112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines Printf( 2122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "Origin per-stack limit invalid: %d. Must be 0 (unlimited) or in [1, " 2132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines "%d] range.\n", 2142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines f->origin_history_per_stack_limit, kStackDepotMaxUseCount / 2); 2152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines Die(); 2162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 2176a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines if (f->store_context_size < 1) f->store_context_size = 1; 21878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 21978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 2206d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesvoid GetStackTrace(BufferedStackTrace *stack, uptr max_s, uptr pc, uptr bp, 221f16dc4234098a22a9d0d56f0198d87905481e7fdAlexey Samsonov bool request_fast_unwind) { 2222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines MsanThread *t = GetCurrentThread(); 2232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (!t || !StackTrace::WillUseFastUnwind(request_fast_unwind)) { 22493c26022f362c9e0a6acbe3bf3c7c395e19e0835Reid Kleckner // Block reports from our interceptors during _Unwind_Backtrace. 22593c26022f362c9e0a6acbe3bf3c7c395e19e0835Reid Kleckner SymbolizerScope sym_scope; 226799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar return stack->Unwind(max_s, pc, bp, nullptr, 0, 0, request_fast_unwind); 22793c26022f362c9e0a6acbe3bf3c7c395e19e0835Reid Kleckner } 228799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar stack->Unwind(max_s, pc, bp, nullptr, t->stack_top(), t->stack_bottom(), 2292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines request_fast_unwind); 23078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 23178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 23278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid PrintWarning(uptr pc, uptr bp) { 23378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov PrintWarningWithOrigin(pc, bp, __msan_origin_tls); 23478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 23578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 23678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid PrintWarningWithOrigin(uptr pc, uptr bp, u32 origin) { 23778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (msan_expect_umr) { 23878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov // Printf("Expected UMR\n"); 23978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_origin_tls = origin; 24078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov msan_expected_umr_found = 1; 24178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return; 24278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 24378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 24499bf1d71c634ab0ed39d7614fd8f8f2c2201e111Evgeniy Stepanov ++msan_report_count; 24599bf1d71c634ab0ed39d7614fd8f8f2c2201e111Evgeniy Stepanov 2462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GET_FATAL_STACK_TRACE_PC_BP(pc, bp); 247db010dae23962ab6089ad1e97af176b7215cb35cEvgeniy Stepanov 248db010dae23962ab6089ad1e97af176b7215cb35cEvgeniy Stepanov u32 report_origin = 24986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines (__msan_get_track_origins() && Origin::isValidId(origin)) ? origin : 0; 250db010dae23962ab6089ad1e97af176b7215cb35cEvgeniy Stepanov ReportUMR(&stack, report_origin); 251db010dae23962ab6089ad1e97af176b7215cb35cEvgeniy Stepanov 25286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines if (__msan_get_track_origins() && !Origin::isValidId(origin)) { 25348ed0580871e66c61e856a2281280929f6f77593Evgeniy Stepanov Printf( 25448ed0580871e66c61e856a2281280929f6f77593Evgeniy Stepanov " ORIGIN: invalid (%x). Might be a bug in MemorySanitizer origin " 25548ed0580871e66c61e856a2281280929f6f77593Evgeniy Stepanov "tracking.\n This could still be a bug in your code, too!\n", 25648ed0580871e66c61e856a2281280929f6f77593Evgeniy Stepanov origin); 25778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 25878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 25978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 260c2918bf11fc65b1f9551eee03719e9bdf02eedd5Alexey Samsonovvoid UnpoisonParam(uptr n) { 261c2918bf11fc65b1f9551eee03719e9bdf02eedd5Alexey Samsonov internal_memset(__msan_param_tls, 0, n * sizeof(*__msan_param_tls)); 262c2918bf11fc65b1f9551eee03719e9bdf02eedd5Alexey Samsonov} 263c2918bf11fc65b1f9551eee03719e9bdf02eedd5Alexey Samsonov 2640e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov// Backup MSan runtime TLS state. 2650e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov// Implementation must be async-signal-safe. 2660e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov// Instances of this class may live on the signal handler stack, and data size 2670e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov// may be an issue. 2680e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanovvoid ScopedThreadLocalStateBackup::Backup() { 2690e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov va_arg_overflow_size_tls = __msan_va_arg_overflow_size_tls; 2700e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov} 2710e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov 2720e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanovvoid ScopedThreadLocalStateBackup::Restore() { 2730e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov // A lame implementation that only keeps essential state and resets the rest. 2740e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov __msan_va_arg_overflow_size_tls = va_arg_overflow_size_tls; 2750e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov 27691659d56bab07fb82ac0edad18c04b333680fd62Evgeniy Stepanov internal_memset(__msan_param_tls, 0, sizeof(__msan_param_tls)); 27791659d56bab07fb82ac0edad18c04b333680fd62Evgeniy Stepanov internal_memset(__msan_retval_tls, 0, sizeof(__msan_retval_tls)); 27891659d56bab07fb82ac0edad18c04b333680fd62Evgeniy Stepanov internal_memset(__msan_va_arg_tls, 0, sizeof(__msan_va_arg_tls)); 2790e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov 2800e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov if (__msan_get_track_origins()) { 2812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines internal_memset(&__msan_retval_origin_tls, 0, 2822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines sizeof(__msan_retval_origin_tls)); 283c154820b43052cfc54ee20752a3232aa8e6c7843Alexey Samsonov internal_memset(__msan_param_origin_tls, 0, 284c154820b43052cfc54ee20752a3232aa8e6c7843Alexey Samsonov sizeof(__msan_param_origin_tls)); 2850e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov } 2860e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov} 2870e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanov 2880e38a67cd2d877e8680d65878c86c9e7e4fa4b1dEvgeniy Stepanovvoid UnpoisonThreadLocalState() { 28991659d56bab07fb82ac0edad18c04b333680fd62Evgeniy Stepanov} 29091659d56bab07fb82ac0edad18c04b333680fd62Evgeniy Stepanov 2912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesconst char *GetStackOriginDescr(u32 id, uptr *pc) { 2926f3460595f10fb4740ccd0beaa888a0e47ed48cdEvgeniy Stepanov CHECK_LT(id, kNumStackOriginDescrs); 2936f3460595f10fb4740ccd0beaa888a0e47ed48cdEvgeniy Stepanov if (pc) *pc = StackOriginPC[id]; 2946f3460595f10fb4740ccd0beaa888a0e47ed48cdEvgeniy Stepanov return StackOriginDescr[id]; 2956f3460595f10fb4740ccd0beaa888a0e47ed48cdEvgeniy Stepanov} 2966f3460595f10fb4740ccd0beaa888a0e47ed48cdEvgeniy Stepanov 2972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesu32 ChainOrigin(u32 id, StackTrace *stack) { 2982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines MsanThread *t = GetCurrentThread(); 2992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (t && t->InSignalHandler()) 3002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return id; 3012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 30286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines Origin o = Origin::FromRawId(id); 30386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines stack->tag = StackTrace::TAG_UNKNOWN; 30486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines Origin chained = Origin::CreateChainedOrigin(o, stack); 30586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines return chained.raw_id(); 3062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 3072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 308799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar} // namespace __msan 30978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 31078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// Interface. 31178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 31278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovusing namespace __msan; 31378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define MSAN_MAYBE_WARNING(type, size) \ 3152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines void __msan_maybe_warning_##size(type s, u32 o) { \ 3162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GET_CALLER_PC_BP_SP; \ 3172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines (void) sp; \ 3182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (UNLIKELY(s)) { \ 3192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines PrintWarningWithOrigin(pc, bp, o); \ 3202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (__msan::flags()->halt_on_error) { \ 3212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines Printf("Exiting\n"); \ 3222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines Die(); \ 3232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } \ 3242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } \ 3252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 3262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 3272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesMSAN_MAYBE_WARNING(u8, 1) 3282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesMSAN_MAYBE_WARNING(u16, 2) 3292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesMSAN_MAYBE_WARNING(u32, 4) 3302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesMSAN_MAYBE_WARNING(u64, 8) 3312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 3322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define MSAN_MAYBE_STORE_ORIGIN(type, size) \ 3332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines void __msan_maybe_store_origin_##size(type s, void *p, u32 o) { \ 3346a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines if (UNLIKELY(s)) { \ 3356a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines if (__msan_get_track_origins() > 1) { \ 3366a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines GET_CALLER_PC_BP_SP; \ 3376a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines (void) sp; \ 3386a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines GET_STORE_STACK_TRACE_PC_BP(pc, bp); \ 3396a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines o = ChainOrigin(o, &stack); \ 3406a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines } \ 3416a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines *(u32 *)MEM_TO_ORIGIN((uptr)p & ~3UL) = o; \ 3426a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines } \ 3432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 3442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 3452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesMSAN_MAYBE_STORE_ORIGIN(u8, 1) 3462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesMSAN_MAYBE_STORE_ORIGIN(u16, 2) 3472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesMSAN_MAYBE_STORE_ORIGIN(u32, 4) 3482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesMSAN_MAYBE_STORE_ORIGIN(u64, 8) 3492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 35078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_warning() { 35178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov GET_CALLER_PC_BP_SP; 35278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov (void)sp; 35378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov PrintWarning(pc, bp); 354dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukov if (__msan::flags()->halt_on_error) { 3552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (__msan::flags()->print_stats) 3562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ReportStats(); 357bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov Printf("Exiting\n"); 358bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov Die(); 359bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov } 36078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 36178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 36278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_warning_noreturn() { 36378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov GET_CALLER_PC_BP_SP; 36478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov (void)sp; 36578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov PrintWarning(pc, bp); 3662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (__msan::flags()->print_stats) 3672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ReportStats(); 36878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov Printf("Exiting\n"); 36978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov Die(); 37078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 37178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 37278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_init() { 3732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CHECK(!msan_init_is_running); 37478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (msan_inited) return; 37578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov msan_init_is_running = 1; 376859778a4e2dffa4024fa3e13b105fd62eca44b1cKostya Serebryany SanitizerToolName = "MemorySanitizer"; 37778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 378c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar AvoidCVE_2016_2143(); 37910fd3227546d17c7411241a45ebc143b2031c78dEvgeniy Stepanov InitTlsSize(); 380a537ea99d3dcc4b2dc0033aee7ad5cb1b378efc7Evgeniy Stepanov 381cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar CacheBinaryName(); 382799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar InitializeFlags(); 383799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar 384a537ea99d3dcc4b2dc0033aee7ad5cb1b378efc7Evgeniy Stepanov __sanitizer_set_report_path(common_flags()->log_path); 385a537ea99d3dcc4b2dc0033aee7ad5cb1b378efc7Evgeniy Stepanov 38678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov InitializeInterceptors(); 387cfc29de659f3abbb9273fb0fb1c9a3cd5400c81bEvgeniy Stepanov InstallAtExitHandler(); // Needs __cxa_atexit interceptor. 38878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 3896d1862363c88c183b0ed7740fca876342cf0474bStephen Hines DisableCoreDumperIfNecessary(); 39078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (StackSizeIsUnlimited()) { 3912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines VPrintf(1, "Unlimited stack, doing reexec\n"); 39278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov // A reasonably large stack size. It is bigger than the usual 8Mb, because, 39378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov // well, the program could have been run with unlimited stack for a reason. 39478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov SetStackSizeLimitInBytes(32 * 1024 * 1024); 39578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov ReExec(); 39678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 397f35eae83757946decb312deab3f0fe155fe5d580Evgeniy Stepanov 39878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_clear_on_return(); 3992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (__msan_get_track_origins()) 4002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines VPrintf(1, "msan_track_origins\n"); 401cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar if (!InitShadow(__msan_get_track_origins())) { 4024c9ddc143839c9f4b79152737cd2869c99e8e86dEvgeniy Stepanov Printf("FATAL: MemorySanitizer can not mmap the shadow memory.\n"); 40378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov Printf("FATAL: Make sure to compile with -fPIE and to link with -pie.\n"); 4044c9ddc143839c9f4b79152737cd2869c99e8e86dEvgeniy Stepanov Printf("FATAL: Disabling ASLR is known to cause this error.\n"); 4054b48f4563ca25d8915155acc5837e195cf0e5c57Kostya Serebryany Printf("FATAL: If running under GDB, try " 4064b48f4563ca25d8915155acc5837e195cf0e5c57Kostya Serebryany "'set disable-randomization off'.\n"); 40778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov DumpProcessMap(); 40878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov Die(); 40978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 41078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 4116d1862363c88c183b0ed7740fca876342cf0474bStephen Hines Symbolizer::GetOrInit()->AddHooks(EnterSymbolizer, ExitSymbolizer); 41278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 41386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines InitializeCoverage(common_flags()->coverage, common_flags()->coverage_dir); 41486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 4152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines MsanTSDInit(MsanTSDDtor); 4162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 417799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar MsanAllocatorInit(); 418799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar 419799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar MsanThread *main_thread = MsanThread::Create(nullptr, nullptr); 4202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines SetCurrentThread(main_thread); 4212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines main_thread->ThreadStart(); 4222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 423cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar#if MSAN_CONTAINS_UBSAN 424cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar __ubsan::InitAsPlugin(); 425cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar#endif 426cdce50bda3603770cc4ef80cbb613c78b8e47a17Pirama Arumuga Nainar 4272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines VPrintf(1, "MemorySanitizer init done\n"); 4282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 42978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov msan_init_is_running = 0; 43078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov msan_inited = 1; 43178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 43278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 433bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanovvoid __msan_set_keep_going(int keep_going) { 434dbac0a4a41f405d10e3dcad3597fe08986605289Dmitry Vyukov flags()->halt_on_error = !keep_going; 435bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov} 436bb881c736eff073a84cc640d431ae1e58a5e07d4Evgeniy Stepanov 43778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_set_expect_umr(int expect_umr) { 43878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (expect_umr) { 43978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov msan_expected_umr_found = 0; 44078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } else if (!msan_expected_umr_found) { 44178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov GET_CALLER_PC_BP_SP; 44278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov (void)sp; 4432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GET_FATAL_STACK_TRACE_PC_BP(pc, bp); 444db010dae23962ab6089ad1e97af176b7215cb35cEvgeniy Stepanov ReportExpectedUMRNotFound(&stack); 44578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov Die(); 44678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 44778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov msan_expect_umr = expect_umr; 44878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 44978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 45078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_print_shadow(const void *x, uptr size) { 45121bf90dcf562bd05df20eb55b8d0559017574ffbEvgeniy Stepanov if (!MEM_IS_APP(x)) { 45221bf90dcf562bd05df20eb55b8d0559017574ffbEvgeniy Stepanov Printf("Not a valid application address: %p\n", x); 45321bf90dcf562bd05df20eb55b8d0559017574ffbEvgeniy Stepanov return; 45421bf90dcf562bd05df20eb55b8d0559017574ffbEvgeniy Stepanov } 4552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 4562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines DescribeMemoryRange(x, size); 4572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 4582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 4592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid __msan_dump_shadow(const void *x, uptr size) { 4602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (!MEM_IS_APP(x)) { 4612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines Printf("Not a valid application address: %p\n", x); 4622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return; 4632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 4642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 46578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov unsigned char *s = (unsigned char*)MEM_TO_SHADOW(x); 466c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar for (uptr i = 0; i < size; i++) 46778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov Printf("%x%x ", s[i] >> 4, s[i] & 0xf); 46878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov Printf("\n"); 46978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 47078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 47178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovsptr __msan_test_shadow(const void *x, uptr size) { 4722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (!MEM_IS_APP(x)) return -1; 4732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines unsigned char *s = (unsigned char *)MEM_TO_SHADOW((uptr)x); 47478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov for (uptr i = 0; i < size; ++i) 47578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (s[i]) 47678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return i; 47778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return -1; 47878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 47978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 4802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid __msan_check_mem_is_initialized(const void *x, uptr size) { 4812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (!__msan::flags()->report_umrs) return; 4822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines sptr offset = __msan_test_shadow(x, size); 4832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (offset < 0) 4842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return; 4852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 4862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GET_CALLER_PC_BP_SP; 4872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines (void)sp; 4882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines ReportUMRInsideAddressRange(__func__, x, size, offset); 4892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan::PrintWarningWithOrigin(pc, bp, 4906d1862363c88c183b0ed7740fca876342cf0474bStephen Hines __msan_get_origin(((const char *)x) + offset)); 4912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (__msan::flags()->halt_on_error) { 4922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines Printf("Exiting\n"); 4932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines Die(); 4942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 4952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 4962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 49778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovint __msan_set_poison_in_malloc(int do_poison) { 49878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov int old = flags()->poison_in_malloc; 49978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov flags()->poison_in_malloc = do_poison; 50078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return old; 50178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 50278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 5036d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesint __msan_has_dynamic_component() { return false; } 50478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 50578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy StepanovNOINLINE 50678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanovvoid __msan_clear_on_return() { 50778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_param_tls[0] = 0; 50878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 50978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 51011347bf5f008b5970f699241617381d95526d73dAlexey Samsonovvoid __msan_partial_poison(const void* data, void* shadow, uptr size) { 51178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov internal_memcpy((void*)MEM_TO_SHADOW((uptr)data), shadow, size); 51278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 51378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 514799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarvoid __msan_load_unpoisoned(const void *src, uptr size, void *dst) { 51578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov internal_memcpy(dst, src, size); 51678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov __msan_unpoison(dst, size); 51778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 51878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 51911347bf5f008b5970f699241617381d95526d73dAlexey Samsonovvoid __msan_set_origin(const void *a, uptr size, u32 origin) { 52086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines if (__msan_get_track_origins()) SetOrigin(a, size, origin); 52178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 52278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 52378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// 'descr' is created at compile time and contains '----' in the beginning. 52478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// When we see descr for the first time we replace '----' with a uniq id 52578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov// and set the origin to (id | (31-th bit)). 5266d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesvoid __msan_set_alloca_origin(void *a, uptr size, char *descr) { 5276f3460595f10fb4740ccd0beaa888a0e47ed48cdEvgeniy Stepanov __msan_set_alloca_origin4(a, size, descr, 0); 5286f3460595f10fb4740ccd0beaa888a0e47ed48cdEvgeniy Stepanov} 5296f3460595f10fb4740ccd0beaa888a0e47ed48cdEvgeniy Stepanov 5306d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesvoid __msan_set_alloca_origin4(void *a, uptr size, char *descr, uptr pc) { 53178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov static const u32 dash = '-'; 53278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov static const u32 first_timer = 53378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov dash + (dash << 8) + (dash << 16) + (dash << 24); 53478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov u32 *id_ptr = (u32*)descr; 53578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov bool print = false; // internal_strstr(descr + 4, "AllocaTOTest") != 0; 53678c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov u32 id = *id_ptr; 53778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (id == first_timer) { 5382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines u32 idx = atomic_fetch_add(&NumStackOriginDescrs, 1, memory_order_relaxed); 5392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines CHECK_LT(idx, kNumStackOriginDescrs); 5402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines StackOriginDescr[idx] = descr + 4; 541c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#if SANITIZER_PPC64V1 542c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar // On PowerPC64 ELFv1, the address of a function actually points to a 543c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar // three-doubleword data structure with the first field containing 544c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar // the address of the function's code. 545c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar if (pc) 546c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar pc = *reinterpret_cast<uptr*>(pc); 547c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#endif 5482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines StackOriginPC[idx] = pc; 54986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines id = Origin::CreateStackOrigin(idx).raw_id(); 55078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov *id_ptr = id; 55178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (print) 5522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines Printf("First time: idx=%d id=%d %s %p \n", idx, id, descr + 4, pc); 55378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov } 55478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov if (print) 55578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov Printf("__msan_set_alloca_origin: descr=%s id=%x\n", descr + 4, id); 55686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines __msan_set_origin(a, size, id); 55778c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 55878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 5592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesu32 __msan_chain_origin(u32 id) { 5602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GET_CALLER_PC_BP_SP; 5612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines (void)sp; 5622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GET_STORE_STACK_TRACE_PC_BP(pc, bp); 5632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return ChainOrigin(id, &stack); 56478c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 56578c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 56611347bf5f008b5970f699241617381d95526d73dAlexey Samsonovu32 __msan_get_origin(const void *a) { 567b36779d6e9c55e97b2258fe30e8e02c416b14ddaEvgeniy Stepanov if (!__msan_get_track_origins()) return 0; 56878c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr x = (uptr)a; 56978c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr aligned = x & ~3ULL; 57078c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov uptr origin_ptr = MEM_TO_ORIGIN(aligned); 57178c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return *(u32*)origin_ptr; 57278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 57378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov 57486277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesint __msan_origin_is_descendant_or_same(u32 this_id, u32 prev_id) { 57586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines Origin o = Origin::FromRawId(this_id); 57686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines while (o.raw_id() != prev_id && o.isChainedOrigin()) 57786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines o = o.getNextChainedOrigin(nullptr); 57886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines return o.raw_id() == prev_id; 57986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines} 58086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 58112c46937db2a5ab9237ce314c3f3a83636e8a575Evgeniy Stepanovu32 __msan_get_umr_origin() { 58278c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov return __msan_origin_tls; 58378c56c3c407d2c92825c86e6af7a0230d6019a1cEvgeniy Stepanov} 58470c6e3fb6dfddb9c4d26ac133beb5f53b71e47d9Kostya Serebryany 5852e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanovu16 __sanitizer_unaligned_load16(const uu16 *p) { 586c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar *(uu16 *)&__msan_retval_tls[0] = *(uu16 *)MEM_TO_SHADOW((uptr)p); 5877ad195c7686f7246d6afa36e930884efae42abeeEvgeniy Stepanov if (__msan_get_track_origins()) 5882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_retval_origin_tls = GetOriginIfPoisoned((uptr)p, sizeof(*p)); 5892e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanov return *p; 590f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov} 5912e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanovu32 __sanitizer_unaligned_load32(const uu32 *p) { 592c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar *(uu32 *)&__msan_retval_tls[0] = *(uu32 *)MEM_TO_SHADOW((uptr)p); 5937ad195c7686f7246d6afa36e930884efae42abeeEvgeniy Stepanov if (__msan_get_track_origins()) 5942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_retval_origin_tls = GetOriginIfPoisoned((uptr)p, sizeof(*p)); 5952e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanov return *p; 596f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov} 5972e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanovu64 __sanitizer_unaligned_load64(const uu64 *p) { 5982e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanov __msan_retval_tls[0] = *(uu64 *)MEM_TO_SHADOW((uptr)p); 5997ad195c7686f7246d6afa36e930884efae42abeeEvgeniy Stepanov if (__msan_get_track_origins()) 6002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines __msan_retval_origin_tls = GetOriginIfPoisoned((uptr)p, sizeof(*p)); 6012e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanov return *p; 602f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov} 6032e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanovvoid __sanitizer_unaligned_store16(uu16 *p, u16 x) { 604c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar u16 s = *(uu16 *)&__msan_param_tls[1]; 6052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines *(uu16 *)MEM_TO_SHADOW((uptr)p) = s; 6062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (s && __msan_get_track_origins()) 6072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (uu32 o = __msan_param_origin_tls[2]) 6082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines SetOriginIfPoisoned((uptr)p, (uptr)&s, sizeof(s), o); 6092e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanov *p = x; 610f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov} 6112e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanovvoid __sanitizer_unaligned_store32(uu32 *p, u32 x) { 612c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar u32 s = *(uu32 *)&__msan_param_tls[1]; 6132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines *(uu32 *)MEM_TO_SHADOW((uptr)p) = s; 6142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (s && __msan_get_track_origins()) 6152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (uu32 o = __msan_param_origin_tls[2]) 6162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines SetOriginIfPoisoned((uptr)p, (uptr)&s, sizeof(s), o); 6172e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanov *p = x; 618f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov} 6192e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanovvoid __sanitizer_unaligned_store64(uu64 *p, u64 x) { 6202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines u64 s = __msan_param_tls[1]; 6212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines *(uu64 *)MEM_TO_SHADOW((uptr)p) = s; 6222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (s && __msan_get_track_origins()) 6232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (uu32 o = __msan_param_origin_tls[2]) 6242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines SetOriginIfPoisoned((uptr)p, (uptr)&s, sizeof(s), o); 6252e9ffcbc2184f308881fc04ce0799c557b7e5b0fEvgeniy Stepanov *p = x; 626f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov} 627f43f6026dc9374e657fb6300840b18ead6347b74Evgeniy Stepanov 6282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid __msan_set_death_callback(void (*callback)(void)) { 629799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar SetUserDieCallback(callback); 6302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 6312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 63270c6e3fb6dfddb9c4d26ac133beb5f53b71e47d9Kostya Serebryany#if !SANITIZER_SUPPORTS_WEAK_HOOKS 63370c6e3fb6dfddb9c4d26ac133beb5f53b71e47d9Kostya Serebryanyextern "C" { 6343c80c6c574850106481f82b9e23d1c728458d4a9Timur IskhodzhanovSANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE 63570c6e3fb6dfddb9c4d26ac133beb5f53b71e47d9Kostya Serebryanyconst char* __msan_default_options() { return ""; } 63670c6e3fb6dfddb9c4d26ac133beb5f53b71e47d9Kostya Serebryany} // extern "C" 63770c6e3fb6dfddb9c4d26ac133beb5f53b71e47d9Kostya Serebryany#endif 63870c6e3fb6dfddb9c4d26ac133beb5f53b71e47d9Kostya Serebryany 6392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesextern "C" { 6402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesSANITIZER_INTERFACE_ATTRIBUTE 6412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid __sanitizer_print_stack_trace() { 6422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines GET_FATAL_STACK_TRACE_PC_BP(StackTrace::GetCurrentPc(), GET_CURRENT_FRAME()); 6432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines stack.Print(); 6442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 645799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar} // extern "C" 646