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 20namespace __scudo { 21 22Flags scudo_flags_dont_use_directly; // use via flags(). 23 24void Flags::setDefaults() { 25#define SCUDO_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue; 26#include "scudo_flags.inc" 27#undef SCUDO_FLAG 28} 29 30static 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 37void 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 77Flags *getFlags() { 78 return &scudo_flags_dont_use_directly; 79} 80 81} 82