10c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne//===-- sanitizer_common_libcdep.cc ---------------------------------------===// 20c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne// 30c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne// The LLVM Compiler Infrastructure 40c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne// 50c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne// This file is distributed under the University of Illinois Open Source 60c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne// License. See LICENSE.TXT for details. 70c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne// 80c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne//===----------------------------------------------------------------------===// 90c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne// 100c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne// This file is shared between AddressSanitizer and ThreadSanitizer 110c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne// run-time libraries. 120c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne//===----------------------------------------------------------------------===// 130c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne 140c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne#include "sanitizer_common.h" 152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include "sanitizer_flags.h" 160c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne 170c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbournenamespace __sanitizer { 180c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne 190c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbournebool PrintsToTty() { 200c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne MaybeOpenReportFile(); 215e97ba38b00eb843a55189bb913b445cbe620894Timur Iskhodzhanov return internal_isatty(report_fd) != 0; 220c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne} 230c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne 24650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveevbool PrintsToTtyCached() { 25650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveev // FIXME: Add proper Windows support to AnsiColorDecorator and re-enable color 26650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveev // printing on Windows. 27650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveev if (SANITIZER_WINDOWS) 28650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveev return 0; 29650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveev 30650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveev static int cached = 0; 31650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveev static bool prints_to_tty; 32650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveev if (!cached) { // Not thread-safe. 33650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveev prints_to_tty = PrintsToTty(); 34650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveev cached = 1; 35650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveev } 36650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveev return prints_to_tty; 37650c7d44b659ddfb4af471dc2ad79a727b7de939Sergey Matveev} 382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesbool ColorizeReports() { 402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines const char *flag = common_flags()->color; 412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return internal_strcmp(flag, "always") == 0 || 422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines (internal_strcmp(flag, "auto") == 0 && PrintsToTtyCached()); 432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstatic void (*sandboxing_callback)(); 462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid SetSandboxingCallback(void (*f)()) { 472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines sandboxing_callback = f; 482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 500c547de62dc0852a03fae2d868fa571e7f5512b3Peter Collingbourne} // namespace __sanitizer 512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid NOINLINE 532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines__sanitizer_sandbox_on_notify(__sanitizer_sandbox_arguments *args) { 542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines PrepareForSandboxing(args); 552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (sandboxing_callback) 562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines sandboxing_callback(); 572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 58