1c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar//===-- scudo_flags.cpp -----------------------------------------*- C++ -*-===// 2c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// 3c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// The LLVM Compiler Infrastructure 4c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// 5c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source 6c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// License. See LICENSE.TXT for details. 7c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// 8c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar//===----------------------------------------------------------------------===// 9c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/// 10c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/// Hardened Allocator flag parsing logic. 11c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/// 12c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar//===----------------------------------------------------------------------===// 13c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 14c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#include "scudo_flags.h" 15c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#include "scudo_utils.h" 16c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 17c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#include "sanitizer_common/sanitizer_flags.h" 18c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#include "sanitizer_common/sanitizer_flag_parser.h" 19c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 20c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarnamespace __scudo { 21c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 22c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarFlags scudo_flags_dont_use_directly; // use via flags(). 23c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 24c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarvoid Flags::setDefaults() { 25c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define SCUDO_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue; 26c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#include "scudo_flags.inc" 27c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#undef SCUDO_FLAG 28c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar} 29c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 30c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarstatic void RegisterScudoFlags(FlagParser *parser, Flags *f) { 31c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define SCUDO_FLAG(Type, Name, DefaultValue, Description) \ 32c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar RegisterFlag(parser, #Name, Description, &f->Name); 33c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#include "scudo_flags.inc" 34c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#undef SCUDO_FLAG 35c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar} 36c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 37c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarvoid initFlags() { 38c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar SetCommonFlagsDefaults(); 39c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar { 40c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar CommonFlags cf; 41c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar cf.CopyFrom(*common_flags()); 42c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar cf.exitcode = 1; 43c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar OverrideCommonFlags(cf); 44c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar } 45c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar Flags *f = getFlags(); 46c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar f->setDefaults(); 47c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 48c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar FlagParser scudo_parser; 49c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar RegisterScudoFlags(&scudo_parser, f); 50c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar RegisterCommonFlags(&scudo_parser); 51c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 52c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar scudo_parser.ParseString(GetEnv("SCUDO_OPTIONS")); 53c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 54c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar InitializeCommonFlags(); 55c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 56c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar // Sanity checks and default settings for the Quarantine parameters. 57c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 58c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar if (f->QuarantineSizeMb < 0) { 59c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar const int DefaultQuarantineSizeMb = 64; 60c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar f->QuarantineSizeMb = DefaultQuarantineSizeMb; 61c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar } 62c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar // We enforce an upper limit for the quarantine size of 4Gb. 63c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar if (f->QuarantineSizeMb > (4 * 1024)) { 64c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar dieWithMessage("ERROR: the quarantine size is too large\n"); 65c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar } 66c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar if (f->ThreadLocalQuarantineSizeKb < 0) { 67c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar const int DefaultThreadLocalQuarantineSizeKb = 1024; 68c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar f->ThreadLocalQuarantineSizeKb = DefaultThreadLocalQuarantineSizeKb; 69c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar } 70c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar // And an upper limit of 128Mb for the thread quarantine cache. 71c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar if (f->ThreadLocalQuarantineSizeKb > (128 * 1024)) { 72c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar dieWithMessage("ERROR: the per thread quarantine cache size is too " 73c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar "large\n"); 74c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar } 75c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar} 76c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 77c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarFlags *getFlags() { 78c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar return &scudo_flags_dont_use_directly; 79c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar} 80c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 81c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar} 82