diff options
author | Florian Mayer <fmayer@google.com> | 2023-11-15 04:35:57 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2023-11-15 04:35:57 +0000 |
commit | a2dd96c9fc51084f20880a3035e2ef13f7ac57da (patch) | |
tree | 99ab9fa64c33e9a08a7166c35074375cf4c95c91 | |
parent | e1338487d64a3de3fa31117ed19a2e296d79082a (diff) | |
parent | 6dc55db24e7dd0b824c7888f0eb3b64d05fdf082 (diff) | |
download | scudo-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.cpp | 3 | ||||
-rw-r--r-- | standalone/flags_parser.cpp | 26 | ||||
-rw-r--r-- | standalone/flags_parser.h | 3 |
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(); |