summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Mayer <fmayer@google.com>2023-11-15 04:35:57 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2023-11-15 04:35:57 +0000
commita2dd96c9fc51084f20880a3035e2ef13f7ac57da (patch)
tree99ab9fa64c33e9a08a7166c35074375cf4c95c91
parente1338487d64a3de3fa31117ed19a2e296d79082a (diff)
parent6dc55db24e7dd0b824c7888f0eb3b64d05fdf082 (diff)
downloadscudo-a2dd96c9fc51084f20880a3035e2ef13f7ac57da.tar.gz
[scudo] change allocation buffer size with env var (#71703) am: 4dd77838c4 am: eee13e4cf6 am: 6dc55db24e
Original change: https://android-review.googlesource.com/c/platform/external/scudo/+/2831100 Change-Id: Icd529be068417575e8d91b85c5c4f6cf95c59ce3 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r--standalone/flags.cpp3
-rw-r--r--standalone/flags_parser.cpp26
-rw-r--r--standalone/flags_parser.h3
3 files changed, 26 insertions, 6 deletions
diff --git a/standalone/flags.cpp b/standalone/flags.cpp
index de5153b288b..f498edfbd32 100644
--- a/standalone/flags.cpp
+++ b/standalone/flags.cpp
@@ -68,6 +68,9 @@ void initFlags() {
Parser.parseString(getCompileDefinitionScudoDefaultOptions());
Parser.parseString(getScudoDefaultOptions());
Parser.parseString(getEnv("SCUDO_OPTIONS"));
+ if (const char *V = getEnv("SCUDO_ALLOCATION_RING_BUFFER_SIZE")) {
+ Parser.parseStringPair("allocation_ring_buffer_size", V);
+ }
}
} // namespace scudo
diff --git a/standalone/flags_parser.cpp b/standalone/flags_parser.cpp
index be39fcd4f88..10da6754be8 100644
--- a/standalone/flags_parser.cpp
+++ b/standalone/flags_parser.cpp
@@ -10,6 +10,7 @@
#include "common.h"
#include "report.h"
+#include <limits.h>
#include <stdlib.h>
#include <string.h>
@@ -80,7 +81,7 @@ void FlagParser::parseFlag() {
++Pos;
Value = Buffer + ValueStart;
}
- if (!runHandler(Name, Value))
+ if (!runHandler(Name, Value, '='))
reportError("flag parsing failed.");
}
@@ -122,10 +123,16 @@ inline bool parseBool(const char *Value, bool *b) {
return false;
}
-bool FlagParser::runHandler(const char *Name, const char *Value) {
+void FlagParser::parseStringPair(const char *Name, const char *Value) {
+ if (!runHandler(Name, Value, '\0'))
+ reportError("flag parsing failed.");
+}
+
+bool FlagParser::runHandler(const char *Name, const char *Value,
+ const char Sep) {
for (u32 I = 0; I < NumberOfFlags; ++I) {
const uptr Len = strlen(Flags[I].Name);
- if (strncmp(Name, Flags[I].Name, Len) != 0 || Name[Len] != '=')
+ if (strncmp(Name, Flags[I].Name, Len) != 0 || Name[Len] != Sep)
continue;
bool Ok = false;
switch (Flags[I].Type) {
@@ -136,8 +143,17 @@ bool FlagParser::runHandler(const char *Name, const char *Value) {
break;
case FlagType::FT_int:
char *ValueEnd;
- *reinterpret_cast<int *>(Flags[I].Var) =
- static_cast<int>(strtol(Value, &ValueEnd, 10));
+ long V = strtol(Value, &ValueEnd, 10);
+ static_assert(INT_MAX <= LONG_MAX);
+ static_assert(INT_MIN >= LONG_MIN);
+ // strtol returns LONG_MAX on overflow and LONG_MIN on underflow.
+ // This is why we compare-equal here (and lose INT_MIN and INT_MAX as a
+ // value, but that's okay)
+ if (V >= INT_MAX || V <= INT_MIN) {
+ reportInvalidFlag("int", Value);
+ return false;
+ }
+ *reinterpret_cast<int *>(Flags[I].Var) = static_cast<int>(V);
Ok =
*ValueEnd == '"' || *ValueEnd == '\'' || isSeparatorOrNull(*ValueEnd);
if (!Ok)
diff --git a/standalone/flags_parser.h b/standalone/flags_parser.h
index ba832adbd90..ded496fda3b 100644
--- a/standalone/flags_parser.h
+++ b/standalone/flags_parser.h
@@ -27,6 +27,7 @@ public:
void *Var);
void parseString(const char *S);
void printFlagDescriptions();
+ void parseStringPair(const char *Name, const char *Value);
private:
static const u32 MaxFlags = 20;
@@ -45,7 +46,7 @@ private:
void skipWhitespace();
void parseFlags();
void parseFlag();
- bool runHandler(const char *Name, const char *Value);
+ bool runHandler(const char *Name, const char *Value, char Sep);
};
void reportUnrecognizedFlags();