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