Skip to content

Commit d1168df

Browse files
authored
[scudo] change allocation buffer size with env var (#71703)
We don't allow SCUDO_OPTIONS to be preserved across SELinux transitions, so introducing a more constrained one that we can preserve.
1 parent a66dc46 commit d1168df

File tree

3 files changed

+26
-6
lines changed

3 files changed

+26
-6
lines changed

compiler-rt/lib/scudo/standalone/flags.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ void initFlags() {
6868
Parser.parseString(getCompileDefinitionScudoDefaultOptions());
6969
Parser.parseString(getScudoDefaultOptions());
7070
Parser.parseString(getEnv("SCUDO_OPTIONS"));
71+
if (const char *V = getEnv("SCUDO_ALLOCATION_RING_BUFFER_SIZE")) {
72+
Parser.parseStringPair("allocation_ring_buffer_size", V);
73+
}
7174
}
7275

7376
} // namespace scudo

compiler-rt/lib/scudo/standalone/flags_parser.cpp

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "common.h"
1111
#include "report.h"
1212

13+
#include <limits.h>
1314
#include <stdlib.h>
1415
#include <string.h>
1516

@@ -80,7 +81,7 @@ void FlagParser::parseFlag() {
8081
++Pos;
8182
Value = Buffer + ValueStart;
8283
}
83-
if (!runHandler(Name, Value))
84+
if (!runHandler(Name, Value, '='))
8485
reportError("flag parsing failed.");
8586
}
8687

@@ -122,10 +123,16 @@ inline bool parseBool(const char *Value, bool *b) {
122123
return false;
123124
}
124125

125-
bool FlagParser::runHandler(const char *Name, const char *Value) {
126+
void FlagParser::parseStringPair(const char *Name, const char *Value) {
127+
if (!runHandler(Name, Value, '\0'))
128+
reportError("flag parsing failed.");
129+
}
130+
131+
bool FlagParser::runHandler(const char *Name, const char *Value,
132+
const char Sep) {
126133
for (u32 I = 0; I < NumberOfFlags; ++I) {
127134
const uptr Len = strlen(Flags[I].Name);
128-
if (strncmp(Name, Flags[I].Name, Len) != 0 || Name[Len] != '=')
135+
if (strncmp(Name, Flags[I].Name, Len) != 0 || Name[Len] != Sep)
129136
continue;
130137
bool Ok = false;
131138
switch (Flags[I].Type) {
@@ -136,8 +143,17 @@ bool FlagParser::runHandler(const char *Name, const char *Value) {
136143
break;
137144
case FlagType::FT_int:
138145
char *ValueEnd;
139-
*reinterpret_cast<int *>(Flags[I].Var) =
140-
static_cast<int>(strtol(Value, &ValueEnd, 10));
146+
long V = strtol(Value, &ValueEnd, 10);
147+
static_assert(INT_MAX <= LONG_MAX);
148+
static_assert(INT_MIN >= LONG_MIN);
149+
// strtol returns LONG_MAX on overflow and LONG_MIN on underflow.
150+
// This is why we compare-equal here (and lose INT_MIN and INT_MAX as a
151+
// value, but that's okay)
152+
if (V >= INT_MAX || V <= INT_MIN) {
153+
reportInvalidFlag("int", Value);
154+
return false;
155+
}
156+
*reinterpret_cast<int *>(Flags[I].Var) = static_cast<int>(V);
141157
Ok =
142158
*ValueEnd == '"' || *ValueEnd == '\'' || isSeparatorOrNull(*ValueEnd);
143159
if (!Ok)

compiler-rt/lib/scudo/standalone/flags_parser.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class FlagParser {
2727
void *Var);
2828
void parseString(const char *S);
2929
void printFlagDescriptions();
30+
void parseStringPair(const char *Name, const char *Value);
3031

3132
private:
3233
static const u32 MaxFlags = 20;
@@ -45,7 +46,7 @@ class FlagParser {
4546
void skipWhitespace();
4647
void parseFlags();
4748
void parseFlag();
48-
bool runHandler(const char *Name, const char *Value);
49+
bool runHandler(const char *Name, const char *Value, char Sep);
4950
};
5051

5152
void reportUnrecognizedFlags();

0 commit comments

Comments
 (0)