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