[fuzzing] Fix fuzzer found bug (#33291)

We had an infinite recursion in our tracer parsing code... probably not
a biggy, but it was blocking the fuzzers so fixing.

<!--

If you know who should review your pull request, please assign it to
that
person, otherwise the pull request would get assigned randomly.

If your pull request is for a specific language, please add the
appropriate
lang label.

-->
pull/33294/head
Craig Tiller 2 years ago committed by GitHub
parent bde995281a
commit 2892b24eab
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 79
      src/core/lib/debug/trace.cc
  2. 4
      src/core/lib/debug/trace.h
  3. 7
      test/core/resource_quota/memory_quota_fuzzer_corpus/clusterfuzz-testcase-minimized-memory_quota_fuzzer-5347756575096832.test

@ -20,16 +20,16 @@
#include "src/core/lib/debug/trace.h" #include "src/core/lib/debug/trace.h"
#include <string.h>
#include <string> #include <string>
#include <type_traits> #include <type_traits>
#include <utility> #include <utility>
#include "absl/strings/ascii.h"
#include "absl/strings/match.h"
#include "absl/strings/str_split.h"
#include "absl/strings/string_view.h" #include "absl/strings/string_view.h"
#include <grpc/grpc.h> #include <grpc/grpc.h>
#include <grpc/support/alloc.h>
#include <grpc/support/log.h> #include <grpc/support/log.h>
#include "src/core/lib/config/config_vars.h" #include "src/core/lib/config/config_vars.h"
@ -40,31 +40,31 @@ namespace grpc_core {
TraceFlag* TraceFlagList::root_tracer_ = nullptr; TraceFlag* TraceFlagList::root_tracer_ = nullptr;
bool TraceFlagList::Set(const char* name, bool enabled) { bool TraceFlagList::Set(absl::string_view name, bool enabled) {
TraceFlag* t; TraceFlag* t;
if (0 == strcmp(name, "all")) { if (name == "all") {
for (t = root_tracer_; t; t = t->next_tracer_) { for (t = root_tracer_; t; t = t->next_tracer_) {
t->set_enabled(enabled); t->set_enabled(enabled);
} }
} else if (0 == strcmp(name, "list_tracers")) { } else if (name == "list_tracers") {
LogAllTracers(); LogAllTracers();
} else if (0 == strcmp(name, "refcount")) { } else if (name == "refcount") {
for (t = root_tracer_; t; t = t->next_tracer_) { for (t = root_tracer_; t; t = t->next_tracer_) {
if (strstr(t->name_, "refcount") != nullptr) { if (absl::StrContains(t->name_, "refcount")) {
t->set_enabled(enabled); t->set_enabled(enabled);
} }
} }
} else { } else {
bool found = false; bool found = false;
for (t = root_tracer_; t; t = t->next_tracer_) { for (t = root_tracer_; t; t = t->next_tracer_) {
if (0 == strcmp(name, t->name_)) { if (name == t->name_) {
t->set_enabled(enabled); t->set_enabled(enabled);
found = true; found = true;
} }
} }
// check for unknowns, but ignore "", to allow to GRPC_TRACE= // check for unknowns, but ignore "", to allow to GRPC_TRACE=
if (!found && 0 != strcmp(name, "")) { if (!found && !name.empty()) {
gpr_log(GPR_ERROR, "Unknown trace var: '%s'", name); gpr_log(GPR_ERROR, "Unknown trace var: '%s'", std::string(name).c_str());
return false; // early return return false; // early return
} }
} }
@ -101,59 +101,28 @@ SavedTraceFlags::SavedTraceFlags() { TraceFlagList::SaveTo(values_); }
void SavedTraceFlags::Restore() { void SavedTraceFlags::Restore() {
for (const auto& flag : values_) { for (const auto& flag : values_) {
TraceFlagList::Set(flag.first.c_str(), flag.second); TraceFlagList::Set(flag.first, flag.second);
}
}
} // namespace grpc_core
static void add(const char* beg, const char* end, char*** ss, size_t* ns) {
size_t n = *ns;
size_t np = n + 1;
char* s;
size_t len;
GPR_ASSERT(end >= beg);
len = static_cast<size_t>(end - beg);
s = static_cast<char*>(gpr_malloc(len + 1));
memcpy(s, beg, len);
s[len] = 0;
*ss = static_cast<char**>(gpr_realloc(*ss, sizeof(char**) * np));
(*ss)[n] = s;
*ns = np;
}
static void split(const char* s, char*** ss, size_t* ns) {
const char* c = strchr(s, ',');
if (c == nullptr) {
add(s, s + strlen(s), ss, ns);
} else {
add(s, c, ss, ns);
split(c + 1, ss, ns);
} }
} }
static void parse(const char* s) { namespace {
char** strings = nullptr; void ParseTracers(absl::string_view tracers) {
size_t nstrings = 0; for (auto s : absl::StrSplit(tracers, ',')) {
size_t i; s = absl::StripAsciiWhitespace(s);
split(s, &strings, &nstrings); if (s.empty()) continue;
if (s[0] == '-') {
for (i = 0; i < nstrings; i++) { TraceFlagList::Set(s.substr(1), false);
if (strings[i][0] == '-') {
grpc_core::TraceFlagList::Set(strings[i] + 1, false);
} else { } else {
grpc_core::TraceFlagList::Set(strings[i], true); TraceFlagList::Set(s, true);
} }
} }
for (i = 0; i < nstrings; i++) {
gpr_free(strings[i]);
}
gpr_free(strings);
} }
} // namespace
} // namespace grpc_core
void grpc_tracer_init() { void grpc_tracer_init() {
parse(std::string(grpc_core::ConfigVars::Get().Trace()).c_str()); grpc_core::ParseTracers(grpc_core::ConfigVars::Get().Trace());
} }
int grpc_tracer_set_enabled(const char* name, int enabled) { int grpc_tracer_set_enabled(const char* name, int enabled) {

@ -25,6 +25,8 @@
#include <map> #include <map>
#include <string> #include <string>
#include "absl/strings/string_view.h"
void grpc_tracer_init(); void grpc_tracer_init();
void grpc_tracer_shutdown(void); void grpc_tracer_shutdown(void);
@ -33,7 +35,7 @@ namespace grpc_core {
class TraceFlag; class TraceFlag;
class TraceFlagList { class TraceFlagList {
public: public:
static bool Set(const char* name, bool enabled); static bool Set(absl::string_view name, bool enabled);
static void Add(TraceFlag* flag); static void Add(TraceFlag* flag);
static void SaveTo(std::map<std::string, bool>& values); static void SaveTo(std::map<std::string, bool>& values);

Loading…
Cancel
Save