filter_fuzzer.cc
Go to the documentation of this file.
1 // Copyright 2022 gRPC authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include <map>
16 
17 #include "absl/memory/memory.h"
18 
24 #include "src/core/lib/gpr/env.h"
31 #include "src/libfuzzer/libfuzzer_macro.h"
32 #include "test/core/filters/filter_fuzzer.pb.h"
33 
34 bool squelch = true;
35 
36 static void dont_log(gpr_log_func_args* /*args*/) {}
37 
39 extern gpr_timespec (*gpr_now_impl)(gpr_clock_type clock_type);
40 
41 static gpr_timespec now_impl(gpr_clock_type clock_type) {
42  GPR_ASSERT(clock_type != GPR_TIMESPAN);
43  gpr_timespec ts = g_now;
44  ts.clock_type = clock_type;
45  return ts;
46 }
47 
48 namespace grpc_core {
49 namespace {
50 
51 const grpc_transport_vtable kFakeTransportVTable = {
52  // sizeof_stream
53  0,
54  // name
55  "fake_transport",
56  // init_stream
57  [](grpc_transport*, grpc_stream*, grpc_stream_refcount*, const void*,
58  Arena*) -> int { abort(); },
59  // make_call_promise
60  [](grpc_transport*,
61  ClientMetadataHandle) -> ArenaPromise<ServerMetadataHandle> { abort(); },
62  // set_pollset
63  [](grpc_transport*, grpc_stream*, grpc_pollset*) { abort(); },
64  // set_pollset_set
65  [](grpc_transport*, grpc_stream*, grpc_pollset_set*) { abort(); },
66  // perform_stream_op
68  abort();
69  },
70  // perform_op
71  [](grpc_transport*, grpc_transport_op*) { abort(); },
72  // destroy_stream
73  [](grpc_transport*, grpc_stream*, grpc_closure*) { abort(); },
74  // destroy
75  [](grpc_transport*) { abort(); },
76  // get_endpoint
77  [](grpc_transport*) -> grpc_endpoint* { abort(); },
78 };
79 
80 class FakeChannelSecurityConnector final
82  public:
83  FakeChannelSecurityConnector()
84  : grpc_channel_security_connector("fake", nullptr, nullptr) {}
85 
86  void check_peer(tsi_peer, grpc_endpoint*, RefCountedPtr<grpc_auth_context>*,
87  grpc_closure*) override {
88  abort();
89  }
90 
91  void cancel_check_peer(grpc_closure*, grpc_error_handle) override { abort(); }
92 
93  int cmp(const grpc_security_connector*) const override { abort(); }
94 
95  ArenaPromise<absl::Status> CheckCallHost(absl::string_view,
96  grpc_auth_context*) override {
98  return [this, qry]() -> Poll<absl::Status> {
99  auto it = check_call_host_results_.find(qry);
100  if (it == check_call_host_results_.end()) return Pending{};
101  return it->second;
102  };
103  }
104 
105  void add_handshakers(const grpc_channel_args*, grpc_pollset_set*,
106  HandshakeManager*) override {
107  abort();
108  }
109 
110  void FinishCheckCallHost(uint32_t qry, absl::Status status) {
112  check_call_host_wakers_[qry].Wakeup();
113  }
114 
115  private:
117  std::map<uint32_t, Waker> check_call_host_wakers_;
118  std::map<uint32_t, absl::Status> check_call_host_results_;
119 };
120 
121 class ConstAuthorizationEngine final : public AuthorizationEngine {
122  public:
123  explicit ConstAuthorizationEngine(AuthorizationEngine::Decision decision)
124  : decision_(decision) {}
125 
126  Decision Evaluate(const EvaluateArgs&) const override { return decision_; }
127 
128  private:
129  Decision decision_;
130 };
131 
132 class FakeAuthorizationPolicyProvider final
134  public:
135  explicit FakeAuthorizationPolicyProvider(AuthorizationEngines engines)
136  : engines_(engines) {}
137  void Orphan() override {}
138  AuthorizationEngines engines() override { return engines_; }
139 
140  private:
141  AuthorizationEngines engines_;
142 };
143 
144 struct GlobalObjects {
146  grpc_transport transport{&kFakeTransportVTable};
147  RefCountedPtr<FakeChannelSecurityConnector> channel_security_connector{
148  MakeRefCounted<FakeChannelSecurityConnector>()};
149 
150  void Perform(const filter_fuzzer::GlobalObjectAction& action) {
151  switch (action.type_case()) {
152  case filter_fuzzer::GlobalObjectAction::TYPE_NOT_SET:
153  break;
154  case filter_fuzzer::GlobalObjectAction::kSetResourceQuota:
155  resource_quota->memory_quota()->SetSize(action.set_resource_quota());
156  break;
157  case filter_fuzzer::GlobalObjectAction::kFinishCheckCallHost:
158  channel_security_connector->FinishCheckCallHost(
159  action.finish_check_call_host().qry(),
160  absl::Status(
161  absl::StatusCode(action.finish_check_call_host().status()),
162  action.finish_check_call_host().message()));
163  break;
164  }
165  }
166 };
167 
168 RefCountedPtr<AuthorizationEngine> LoadAuthorizationEngine(
169  const filter_fuzzer::AuthorizationEngine& engine) {
170  switch (engine.engine_case()) {
171  case filter_fuzzer::AuthorizationEngine::kAlwaysAllow:
172  return MakeRefCounted<ConstAuthorizationEngine>(
173  AuthorizationEngine::Decision{
175  engine.always_allow()});
176  case filter_fuzzer::AuthorizationEngine::kAlwaysDeny:
177  return MakeRefCounted<ConstAuthorizationEngine>(
178  AuthorizationEngine::Decision{
180  engine.always_deny()});
181  case filter_fuzzer::AuthorizationEngine::ENGINE_NOT_SET:
182  break;
183  }
184  return MakeRefCounted<ConstAuthorizationEngine>(AuthorizationEngine::Decision{
185  AuthorizationEngine::Decision::Type::kAllow, engine.always_allow()});
186 }
187 
188 template <typename FuzzerChannelArgs>
189 ChannelArgs LoadChannelArgs(const FuzzerChannelArgs& fuzz_args,
190  GlobalObjects* globals) {
191  ChannelArgs args = ChannelArgs().SetObject(ResourceQuota::Default());
192  for (const auto& arg : fuzz_args) {
193  if (arg.key() == ResourceQuota::ChannelArgName()) {
194  if (arg.value_case() == filter_fuzzer::ChannelArg::kResourceQuota) {
195  args = args.SetObject(globals->resource_quota);
196  }
197  } else if (arg.key() == GRPC_ARG_TRANSPORT) {
198  if (arg.value_case() == filter_fuzzer::ChannelArg::kTransport) {
199  args = args.SetObject(&globals->transport);
200  }
201  } else if (arg.key() == GRPC_ARG_SECURITY_CONNECTOR) {
202  if (arg.value_case() ==
203  filter_fuzzer::ChannelArg::kChannelSecurityConnector) {
204  args = args.SetObject(globals->channel_security_connector);
205  }
206  } else if (arg.key() == GRPC_AUTH_CONTEXT_ARG) {
207  if (arg.value_case() == filter_fuzzer::ChannelArg::kAuthContext) {
208  args = args.SetObject(MakeRefCounted<grpc_auth_context>(nullptr));
209  }
210  } else if (arg.key() == GRPC_ARG_AUTHORIZATION_POLICY_PROVIDER) {
211  if (arg.value_case() ==
212  filter_fuzzer::ChannelArg::kAuthorizationPolicyProvider) {
213  args = args.SetObject(MakeRefCounted<FakeAuthorizationPolicyProvider>(
215  LoadAuthorizationEngine(
216  arg.authorization_policy_provider().allow_engine()),
217  LoadAuthorizationEngine(
218  arg.authorization_policy_provider().deny_engine())}));
219  }
220  } else {
221  switch (arg.value_case()) {
222  case filter_fuzzer::ChannelArg::VALUE_NOT_SET:
223  break;
224  case filter_fuzzer::ChannelArg::kStr:
225  args = args.Set(arg.key(), arg.str());
226  break;
227  case filter_fuzzer::ChannelArg::kI:
228  args = args.Set(arg.key(), arg.i());
229  break;
230  case filter_fuzzer::ChannelArg::kResourceQuota:
231  case filter_fuzzer::ChannelArg::kTransport:
232  case filter_fuzzer::ChannelArg::kChannelSecurityConnector:
233  case filter_fuzzer::ChannelArg::kAuthContext:
234  case filter_fuzzer::ChannelArg::kAuthorizationPolicyProvider:
235  break;
236  }
237  }
238  }
239  return args;
240 }
241 
242 const grpc_channel_filter* const kFilters[] = {
247  // We exclude this one internally, so we can't have it here - will need to
248  // pick it up through some future registration mechanism.
249  // MAKE_FILTER(ServerLoadReportingFilter),
250 };
251 
252 const grpc_channel_filter* FindFilter(absl::string_view name) {
253  for (size_t i = 0; i < GPR_ARRAY_SIZE(kFilters); ++i) {
254  if (name == kFilters[i]->name) return kFilters[i];
255  }
256  return nullptr;
257 }
258 
259 class MainLoop {
260  public:
261  MainLoop(RefCountedPtr<grpc_channel_stack> channel_stack,
262  ChannelArgs channel_args)
263  : memory_allocator_(channel_args.GetObject<ResourceQuota>()
264  ->memory_quota()
265  ->CreateMemoryAllocator("test")),
266  channel_stack_(std::move(channel_stack)) {}
267 
268  ~MainLoop() {
269  ExecCtx exec_ctx;
270  calls_.clear();
272  }
273 
274  void Run(const filter_fuzzer::Action& action, GlobalObjects* globals) {
275  ExecCtx exec_ctx;
276  for (auto id : absl::exchange(wakeups_, {})) {
277  if (auto* call = GetCall(id)) call->Wakeup();
278  }
279  switch (action.type_case()) {
280  case filter_fuzzer::Action::TYPE_NOT_SET:
281  break;
282  case filter_fuzzer::Action::kAdvanceTimeMicroseconds:
284  g_now, gpr_time_from_micros(action.advance_time_microseconds(),
285  GPR_TIMESPAN));
286  break;
287  case filter_fuzzer::Action::kCancel:
288  calls_.erase(action.call());
289  break;
290  case filter_fuzzer::Action::kCreateCall:
291  calls_.emplace(
292  action.call(),
293  absl::make_unique<Call>(this, action.call(), action.create_call()));
294  break;
295  case filter_fuzzer::Action::kReceiveInitialMetadata:
296  if (auto* call = GetCall(action.call())) {
297  call->RecvInitialMetadata(action.receive_initial_metadata());
298  }
299  break;
300  case filter_fuzzer::Action::kReceiveTrailingMetadata:
301  if (auto* call = GetCall(action.call())) {
302  call->RecvTrailingMetadata(action.receive_trailing_metadata());
303  }
304  break;
305  case filter_fuzzer::Action::kSetFinalInfo:
306  if (auto* call = GetCall(action.call())) {
307  call->SetFinalInfo(action.set_final_info());
308  }
309  break;
310  case filter_fuzzer::Action::kGlobalObjectAction:
311  globals->Perform(action.global_object_action());
312  }
313  }
314 
315  static const grpc_channel_filter* EndFilter(bool is_client) {
316  static const grpc_channel_filter client_filter =
317  MakePromiseBasedFilter<Call::EndFilter, FilterEndpoint::kClient>(
318  "client-end");
319  static const grpc_channel_filter server_filter =
320  MakePromiseBasedFilter<Call::EndFilter, FilterEndpoint::kServer>(
321  "server-end");
322  return is_client ? &client_filter : &server_filter;
323  }
324 
325  static const grpc_channel_filter* BottomFilter(bool is_client) {
326  static const grpc_channel_filter client_filter =
328  kFilterIsLast>("client-end");
329  static const grpc_channel_filter server_filter =
331  kFilterIsLast>("server-end");
332  return is_client ? &client_filter : &server_filter;
333  }
334 
335  private:
336  class WakeCall final : public Wakeable {
337  public:
338  WakeCall(MainLoop* main_loop, uint32_t id)
339  : main_loop_(main_loop), id_(id) {}
340  void Wakeup() override {
341  for (const uint32_t already : main_loop_->wakeups_) {
342  if (already == id_) return;
343  }
344  main_loop_->wakeups_.push_back(id_);
345  delete this;
346  }
347  void Drop() override { delete this; }
348 
349  private:
350  MainLoop* const main_loop_;
352  };
353 
354  class Call final : public Activity {
355  public:
356  // EndFilter is the last filter that will be invoked for a call
357  class EndFilter : public ChannelFilter {
358  public:
359  static absl::StatusOr<EndFilter> Create(ChannelArgs,
361  return EndFilter{};
362  }
363 
364  // Construct a promise for one call.
365  ArenaPromise<ServerMetadataHandle> MakeCallPromise(
366  CallArgs call_args, NextPromiseFactory) override {
367  Call* call = static_cast<Call*>(Activity::current());
368  if (call->server_initial_metadata_) {
369  call_args.server_initial_metadata->Set(
370  call->server_initial_metadata_.get());
371  } else {
372  call->unset_incoming_server_initial_metadata_latch_ =
373  call_args.server_initial_metadata;
374  }
375  return [call]() -> Poll<ServerMetadataHandle> {
376  return call->CheckCompletion();
377  };
378  }
379  };
380 
381  // BottomFilter is the last filter on a channel stack (for sinking ops)
382  class BottomFilter : public ChannelFilter {
383  public:
384  static absl::StatusOr<BottomFilter> Create(ChannelArgs,
386  return BottomFilter{};
387  }
388 
389  // Construct a promise for one call.
390  ArenaPromise<ServerMetadataHandle> MakeCallPromise(
391  CallArgs call_args, NextPromiseFactory next) override {
392  return next(std::move(call_args));
393  }
394 
395  bool StartTransportOp(grpc_transport_op* op) override {
396  GRPC_ERROR_UNREF(op->disconnect_with_error);
397  GRPC_ERROR_UNREF(op->goaway_error);
399  return true;
400  }
401  };
402 
403  Call(MainLoop* main_loop, uint32_t id,
404  const filter_fuzzer::Metadata& client_initial_metadata)
405  : main_loop_(main_loop), id_(id) {
406  ScopedContext context(this);
407  auto* server_initial_metadata = arena_->New<Latch<ServerMetadata*>>();
408  promise_ = main_loop_->channel_stack_->MakeCallPromise(
409  CallArgs{std::move(*LoadMetadata(client_initial_metadata,
411  server_initial_metadata});
412  Step();
413  }
414 
415  ~Call() override {
416  {
417  ScopedContext context(this);
418  // Don't pass final info thing if we were cancelled.
419  if (promise_.has_value()) final_info_.reset();
420  std::unique_ptr<grpc_call_final_info> final_info;
421  if (final_info_) {
422  final_info = absl::make_unique<grpc_call_final_info>();
423  final_info->final_status =
424  static_cast<grpc_status_code>(final_info_->status());
425  final_info->error_string = final_info_->error_string().c_str();
426  final_info->stats.latency =
428  auto transport_stream_stats_from_proto =
429  [](const filter_fuzzer::TransportOneWayStats& stats) {
431  s.framing_bytes = stats.framing_bytes();
432  s.data_bytes = stats.data_bytes();
433  s.header_bytes = stats.header_bytes();
434  return s;
435  };
436  final_info->stats.transport_stream_stats.incoming =
437  transport_stream_stats_from_proto(final_info_->incoming());
438  final_info->stats.transport_stream_stats.outgoing =
439  transport_stream_stats_from_proto(final_info_->outgoing());
440  }
441  finalization_.Run(final_info.get());
442  }
443 
444  for (int i = 0; i < GRPC_CONTEXT_COUNT; i++) {
445  if (legacy_context_[i].destroy != nullptr) {
447  }
448  }
449  }
450 
451  void Orphan() override { abort(); }
452  void ForceImmediateRepoll() override { context_->set_continue(); }
453  Waker MakeOwningWaker() override {
454  return Waker(new WakeCall(main_loop_, id_));
455  }
456  Waker MakeNonOwningWaker() override { return MakeOwningWaker(); }
457 
458  void RecvInitialMetadata(const filter_fuzzer::Metadata& metadata) {
459  if (server_initial_metadata_ == nullptr) {
460  LoadMetadata(metadata, &server_initial_metadata_);
461  if (auto* latch = absl::exchange(
463  ScopedContext context(this);
464  latch->Set(server_initial_metadata_.get());
465  }
466  }
467  }
468 
469  void RecvTrailingMetadata(const filter_fuzzer::Metadata& metadata) {
470  if (server_trailing_metadata_ == nullptr) {
471  LoadMetadata(metadata, &server_trailing_metadata_);
473  }
474  }
475 
476  void Wakeup() {
477  ScopedContext context(this);
478  Step();
479  }
480 
481  void SetFinalInfo(filter_fuzzer::FinalInfo final_info) {
482  final_info_ = absl::make_unique<filter_fuzzer::FinalInfo>(final_info);
483  }
484 
485  private:
486  class ScopedContext
487  : public ScopedActivity,
488  public promise_detail::Context<Arena>,
489  public promise_detail::Context<grpc_call_context_element>,
490  public promise_detail::Context<CallFinalization> {
491  public:
492  explicit ScopedContext(Call* call)
493  : ScopedActivity(call),
494  promise_detail::Context<Arena>(call->arena_.get()),
495  promise_detail::Context<grpc_call_context_element>(
497  promise_detail::Context<CallFinalization>(&call->finalization_),
498  call_(call) {
499  GPR_ASSERT(call_->context_ == nullptr);
500  call_->context_ = this;
501  }
502  ~ScopedContext() {
503  while (bool step = absl::exchange(continue_, false)) {
504  call_->Step();
505  }
506  GPR_ASSERT(call_->context_ == this);
507  call_->context_ = nullptr;
508  }
509 
510  void set_continue() { continue_ = true; }
511 
512  private:
513  Call* const call_;
514  bool continue_ = false;
515  };
516 
517  template <typename R>
518  absl::optional<MetadataHandle<R>> LoadMetadata(
519  const filter_fuzzer::Metadata& metadata, std::unique_ptr<R>* out) {
520  if (*out != nullptr) return absl::nullopt;
521  *out = absl::make_unique<R>(arena_.get());
522  for (const auto& md : metadata.metadata()) {
523  (*out)->Append(md.key(), Slice::FromCopiedString(md.value()),
524  [](absl::string_view, const Slice&) {});
525  }
526  return MetadataHandle<R>::TestOnlyWrap(out->get());
527  }
528 
529  void Step() {
530  if (!promise_.has_value()) return;
531  auto r = (*promise_)();
532  if (absl::holds_alternative<Pending>(r)) return;
533  ServerMetadataHandle md = std::move(absl::get<ServerMetadataHandle>(r));
534  if (md.get() != server_trailing_metadata_.get()) md->~ServerMetadata();
535  promise_.reset();
536  }
537 
538  Poll<ServerMetadataHandle> CheckCompletion() {
539  if (server_trailing_metadata_ != nullptr) {
542  }
543  server_trailing_metadata_waker_ = MakeOwningWaker();
544  return Pending{};
545  }
546 
547  MainLoop* const main_loop_;
548  const uint32_t id_;
549  ScopedArenaPtr arena_ = MakeScopedArena(32, &main_loop_->memory_allocator_);
551  std::unique_ptr<filter_fuzzer::FinalInfo> final_info_;
552  std::unique_ptr<ClientMetadata> client_initial_metadata_;
553  std::unique_ptr<ServerMetadata> server_initial_metadata_;
555  nullptr;
556  std::unique_ptr<ServerMetadata> server_trailing_metadata_;
558  CallFinalization finalization_;
559  ScopedContext* context_ = nullptr;
561  };
562 
563  Call* GetCall(uint32_t id) {
564  auto it = calls_.find(id);
565  if (it == calls_.end()) return nullptr;
566  return it->second.get();
567  }
568 
569  MemoryAllocator memory_allocator_;
570  RefCountedPtr<grpc_channel_stack> channel_stack_;
571  std::map<uint32_t, std::unique_ptr<Call>> calls_;
572  std::vector<uint32_t> wakeups_;
573 };
574 
575 } // namespace
576 } // namespace grpc_core
577 
578 DEFINE_PROTO_FUZZER(const filter_fuzzer::Msg& msg) {
579  const grpc_channel_filter* filter = grpc_core::FindFilter(msg.filter());
580  if (filter == nullptr) return;
581  if (msg.channel_stack_type() < 0 ||
582  msg.channel_stack_type() >= GRPC_NUM_CHANNEL_STACK_TYPES) {
583  return;
584  }
585 
587  char* grpc_trace_fuzzer = gpr_getenv("GRPC_TRACE_FUZZER");
588  if (squelch && grpc_trace_fuzzer == nullptr) gpr_set_log_function(dont_log);
589  gpr_free(grpc_trace_fuzzer);
590  g_now = {1, 0, GPR_CLOCK_MONOTONIC};
593  grpc_init();
595  {
598  }
599 
600  grpc_core::GlobalObjects globals;
601  auto channel_args = grpc_core::LoadChannelArgs(msg.channel_args(), &globals);
602 
604  msg.stack_name().c_str(),
605  static_cast<grpc_channel_stack_type>(msg.channel_stack_type()));
606  builder.SetChannelArgs(channel_args);
607  builder.AppendFilter(filter);
608  const bool is_client =
609  grpc_channel_stack_type_is_client(builder.channel_stack_type());
610  if (is_client) {
611  builder.AppendFilter(grpc_core::MainLoop::EndFilter(true));
612  } else {
613  builder.PrependFilter(grpc_core::MainLoop::EndFilter(false));
614  }
615  builder.AppendFilter(grpc_core::MainLoop::BottomFilter(is_client));
616  auto stack = [&]() {
618  return builder.Build();
619  }();
620 
621  if (stack.ok()) {
622  grpc_core::MainLoop main_loop(std::move(*stack), std::move(channel_args));
623  for (const auto& action : msg.actions()) {
625  main_loop.Run(action, &globals);
626  }
627  }
628 
629  grpc_shutdown();
630 }
grpc_core::ClientIdleFilter::kFilter
static const grpc_channel_filter kFilter
Definition: channel_idle_filter.h:94
GPR_TIMESPAN
@ GPR_TIMESPAN
Definition: gpr_types.h:45
auth_filters.h
grpc_core::MakeScopedArena
ScopedArenaPtr MakeScopedArena(size_t initial_size, MemoryAllocator *memory_allocator)
Definition: src/core/lib/resource_quota/arena.h:130
grpc_auth_context
Definition: security_context.h:63
gen_build_yaml.out
dictionary out
Definition: src/benchmark/gen_build_yaml.py:24
gpr_now_impl
gpr_timespec(* gpr_now_impl)(gpr_clock_type clock_type)
regen-readme.it
it
Definition: regen-readme.py:15
GRPC_ERROR_NONE
#define GRPC_ERROR_NONE
Definition: error.h:234
get
absl::string_view get(const Cont &c)
Definition: abseil-cpp/absl/strings/str_replace_test.cc:185
grpc_core::HttpClientFilter::kFilter
static const grpc_channel_filter kFilter
Definition: http_client_filter.h:37
metadata
Definition: cq_verifier.cc:48
grpc_transport_vtable
Definition: transport_impl.h:37
channel_idle_filter.h
continue_
bool continue_
Definition: filter_fuzzer.cc:514
grpc_timer_manager_set_threading
void grpc_timer_manager_set_threading(bool enabled)
Definition: iomgr/timer_manager.cc:346
timer_manager.h
grpc_core::TestOnlySetProcessEpoch
void TestOnlySetProcessEpoch(gpr_timespec epoch)
Definition: src/core/lib/gprpp/time.cc:201
grpc_core
Definition: call_metric_recorder.h:31
grpc_core::Activity::current
static Activity * current()
Definition: activity.h:124
client_authority_filter.h
grpc_pollset_set
struct grpc_pollset_set grpc_pollset_set
Definition: iomgr_fwd.h:23
grpc_core::RefCountedPtr::reset
void reset(T *value=nullptr)
Definition: ref_counted_ptr.h:111
absl::string_view
Definition: abseil-cpp/absl/strings/string_view.h:167
Arena
Definition: arena.c:39
grpc_core::GrpcServerAuthzFilter::kFilterVtable
static const grpc_channel_filter kFilterVtable
Definition: grpc_server_authz_filter.h:39
gpr_free
GPRAPI void gpr_free(void *ptr)
Definition: alloc.cc:51
grpc_status_code
grpc_status_code
Definition: include/grpc/impl/codegen/status.h:28
grpc_core::AuthorizationEngine::Decision::Type::kDeny
@ kDeny
status
absl::Status status
Definition: rls.cc:251
GRPC_CONTEXT_COUNT
@ GRPC_CONTEXT_COUNT
Definition: core/lib/channel/context.h:48
grpc_authorization_policy_provider
Definition: src/core/lib/security/authorization/authorization_policy_provider.h:30
setup.name
name
Definition: setup.py:542
env.h
grpc_core::ClientAuthorityFilter::kFilter
static const grpc_channel_filter kFilter
Definition: client_authority_filter.h:39
absl::FormatConversionChar::s
@ s
grpc_core::Executor::SetThreadingAll
static void SetThreadingAll(bool enable)
Definition: executor.cc:446
grpc_core::ServerMetadataHandle
MetadataHandle< ServerMetadata > ServerMetadataHandle
Definition: transport.h:141
grpc_timer_manager_tick
void grpc_timer_manager_tick()
Definition: iomgr/timer_manager.cc:96
grpc_authorization_policy_provider::AuthorizationEngines
Definition: src/core/lib/security/authorization/authorization_policy_provider.h:40
client_initial_metadata_
std::unique_ptr< ClientMetadata > client_initial_metadata_
Definition: filter_fuzzer.cc:552
wakeups_
std::vector< uint32_t > wakeups_
Definition: filter_fuzzer.cc:572
grpc_channel_args
Definition: grpc_types.h:132
resource_quota
ResourceQuotaRefPtr resource_quota
Definition: filter_fuzzer.cc:145
grpc_transport_op
Definition: transport.h:452
gpr_log_func_args
Definition: include/grpc/impl/codegen/log.h:77
call
FilterStackCall * call
Definition: call.cc:750
grpc_core::ScopedArenaPtr
std::unique_ptr< Arena, ScopedArenaDeleter > ScopedArenaPtr
Definition: src/core/lib/resource_quota/arena.h:129
uint32_t
unsigned int uint32_t
Definition: stdint-msvc2008.h:80
decision_
Decision decision_
Definition: filter_fuzzer.cc:129
now_impl
static gpr_timespec now_impl(gpr_clock_type clock_type)
Definition: filter_fuzzer.cc:41
grpc_security_connector
Definition: security_connector.h:61
http_client_filter.h
GRPC_NUM_CHANNEL_STACK_TYPES
@ GRPC_NUM_CHANNEL_STACK_TYPES
Definition: channel_stack_type.h:38
DEBUG_LOCATION
#define DEBUG_LOCATION
Definition: debug_location.h:41
grpc_core::slice_detail::CopyConstructors< Slice >::FromCopiedString
static Slice FromCopiedString(const char *s)
Definition: src/core/lib/slice/slice.h:173
profile_analyzer.builder
builder
Definition: profile_analyzer.py:159
grpc_test_only_set_slice_hash_seed
void grpc_test_only_set_slice_hash_seed(uint32_t seed)
Definition: slice_refcount.cc:33
asyncio_get_stats.args
args
Definition: asyncio_get_stats.py:40
grpc_core::NextPromiseFactory
std::function< ArenaPromise< ServerMetadataHandle >(CallArgs)> NextPromiseFactory
Definition: transport.h:165
promise_
absl::optional< ArenaPromise< ServerMetadataHandle > > promise_
Definition: filter_fuzzer.cc:550
gpr_getenv
char * gpr_getenv(const char *name)
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
arena_
ScopedArenaPtr arena_
Definition: filter_fuzzer.cc:549
hpack_encoder_fixtures::Args
Args({0, 16384})
context_
ScopedContext * context_
Definition: filter_fuzzer.cc:559
grpc_core::MakePromiseBasedFilter
absl::enable_if_t< std::is_base_of< ChannelFilter, F >::value, grpc_channel_filter > MakePromiseBasedFilter(const char *name)
Definition: promise_based_filter.h:487
transport
grpc_transport transport
Definition: filter_fuzzer.cc:146
server_initial_metadata_
std::unique_ptr< ServerMetadata > server_initial_metadata_
Definition: filter_fuzzer.cc:553
server_trailing_metadata_waker_
Waker server_trailing_metadata_waker_
Definition: filter_fuzzer.cc:557
gen_stats_data.stats
list stats
Definition: gen_stats_data.py:58
phony_filter::StartTransportOp
static void StartTransportOp(grpc_channel_element *, grpc_transport_op *)
Definition: bm_call_create.cc:369
absl::optional
Definition: abseil-cpp/absl/types/internal/optional.h:61
arg
Definition: cmdline.cc:40
Call
Definition: api_fuzzer.cc:319
GPR_CLOCK_MONOTONIC
@ GPR_CLOCK_MONOTONIC
Definition: gpr_types.h:36
grpc_core::ResourceQuota::ChannelArgName
static absl::string_view ChannelArgName()
Definition: src/core/lib/resource_quota/resource_quota.h:49
call_
Call *const call_
Definition: filter_fuzzer.cc:513
squelch
bool squelch
Definition: filter_fuzzer.cc:34
grpc_core::ResourceQuota::Default
static ResourceQuotaRefPtr Default()
Definition: resource_quota.cc:27
server_trailing_metadata_
std::unique_ptr< ServerMetadata > server_trailing_metadata_
Definition: filter_fuzzer.cc:556
stack
NodeStack stack
Definition: cord_rep_btree.cc:356
grpc_core::ChannelStackBuilderImpl
Definition: channel_stack_builder_impl.h:33
channel_stack_
RefCountedPtr< grpc_channel_stack > channel_stack_
Definition: filter_fuzzer.cc:570
tests.google.protobuf.internal.message_test.cmp
cmp
Definition: bloaty/third_party/protobuf/python/compatibility_tests/v2.5.0/tests/google/protobuf/internal/message_test.py:61
grpc_core::FilterEndpoint::kClient
@ kClient
resource_quota.h
engines_
AuthorizationEngines engines_
Definition: filter_fuzzer.cc:141
grpc_transport_one_way_stats
Definition: transport.h:243
grpc_core::ExecCtx
Definition: exec_ctx.h:97
grpc_channel_filter
Definition: channel_stack.h:111
msg
std::string msg
Definition: client_interceptors_end2end_test.cc:372
executor.h
grpc_core::MakeResourceQuota
ResourceQuotaRefPtr MakeResourceQuota(std::string name)
Definition: src/core/lib/resource_quota/resource_quota.h:68
calls_
std::map< uint32_t, std::unique_ptr< Call > > calls_
Definition: filter_fuzzer.cc:571
GRPC_ARG_AUTHORIZATION_POLICY_PROVIDER
#define GRPC_ARG_AUTHORIZATION_POLICY_PROVIDER
Definition: grpc_types.h:450
gpr_timespec::clock_type
gpr_clock_type clock_type
Definition: gpr_types.h:55
value
const char * value
Definition: hpack_parser_table.cc:165
grpc_core::kFilterIsLast
static constexpr uint8_t kFilterIsLast
Definition: promise_based_filter.h:115
tsi_peer
Definition: transport_security_interface.h:238
grpc_core::ClientAuthFilter::kFilter
static const grpc_channel_filter kFilter
Definition: auth_filters.h:46
GPR_ARRAY_SIZE
#define GPR_ARRAY_SIZE(array)
Definition: useful.h:129
benchmark.md
md
Definition: benchmark.py:86
grpc_server_authz_filter.h
check_call_host_results_
std::map< uint32_t, absl::Status > check_call_host_results_
Definition: filter_fuzzer.cc:118
absl::StatusCode
StatusCode
Definition: third_party/abseil-cpp/absl/status/status.h:92
client.action
action
Definition: examples/python/xds/client.py:49
gpr_time_add
GPRAPI gpr_timespec gpr_time_add(gpr_timespec a, gpr_timespec b)
Definition: src/core/lib/gpr/time.cc:135
GRPC_AUTH_CONTEXT_ARG
#define GRPC_AUTH_CONTEXT_ARG
Definition: security_context.h:58
http_server_filter.h
gpr_timespec
struct gpr_timespec gpr_timespec
tests.unit._server_ssl_cert_config_test.Call
Call
Definition: _server_ssl_cert_config_test.py:70
exec_ctx
grpc_core::ExecCtx exec_ctx
Definition: end2end_binder_transport_test.cc:75
absl::Status
Definition: third_party/abseil-cpp/absl/status/status.h:424
check_peer
static void check_peer(char *peer_name)
Definition: end2end/tests/simple_request.cc:91
gpr_time_from_micros
GPRAPI gpr_timespec gpr_time_from_micros(int64_t us, gpr_clock_type clock_type)
Definition: src/core/lib/gpr/time.cc:115
next
AllocList * next[kMaxLevel]
Definition: abseil-cpp/absl/base/internal/low_level_alloc.cc:100
fix_build_deps.r
r
Definition: fix_build_deps.py:491
std
Definition: grpcpp/impl/codegen/async_unary_call.h:407
g_now
static gpr_timespec g_now
Definition: filter_fuzzer.cc:38
step
static int step
Definition: test-mutexes.c:31
grpc_core::AuthorizationEngine::Decision::Type::kAllow
@ kAllow
grpc_call_context_element
Definition: core/lib/channel/context.h:51
main_loop_
MainLoop *const main_loop_
Definition: filter_fuzzer.cc:350
grpc_channel_stack_type
grpc_channel_stack_type
Definition: channel_stack_type.h:24
grpc_core::MetadataHandle::TestOnlyWrap
static MetadataHandle TestOnlyWrap(T *p)
Definition: transport.h:123
check_call_host_wakers_
std::map< uint32_t, Waker > check_call_host_wakers_
Definition: filter_fuzzer.cc:117
finalization_
CallFinalization finalization_
Definition: filter_fuzzer.cc:558
dont_log
static void dont_log(gpr_log_func_args *)
Definition: filter_fuzzer.cc:36
GRPC_ERROR_UNREF
#define GRPC_ERROR_UNREF(err)
Definition: error.h:262
GRPC_ARG_SECURITY_CONNECTOR
#define GRPC_ARG_SECURITY_CONNECTOR
Definition: security_connector.h:59
grpc_core::ExecCtx::Run
static void Run(const DebugLocation &location, grpc_closure *closure, grpc_error_handle error)
Definition: exec_ctx.cc:98
grpc_core::FilterEndpoint::kServer
@ kServer
grpc_transport
Definition: transport_impl.h:89
grpc_call_context_element::destroy
void(* destroy)(void *)
Definition: core/lib/channel/context.h:53
grpc_stream
struct grpc_stream grpc_stream
Definition: transport.h:174
channel_stack_builder_impl.h
grpc_channel_security_connector
Definition: security_connector.h:118
id_
uint32_t id_
Definition: filter_fuzzer.cc:351
DEFINE_PROTO_FUZZER
DEFINE_PROTO_FUZZER(const filter_fuzzer::Msg &msg)
Definition: filter_fuzzer.cc:578
grpc_core::ResourceQuotaRefPtr
RefCountedPtr< ResourceQuota > ResourceQuotaRefPtr
Definition: src/core/lib/resource_quota/resource_quota.h:38
context
grpc::ClientContext context
Definition: istio_echo_server_lib.cc:61
grpc_core::ClientMetadataHandle
MetadataHandle< ClientMetadata > ClientMetadataHandle
Definition: transport.h:153
grpc_binder::Metadata
std::vector< std::pair< std::string, std::string > > Metadata
Definition: transaction.h:38
channel_security_connector
RefCountedPtr< FakeChannelSecurityConnector > channel_security_connector
Definition: filter_fuzzer.cc:147
transport_impl.h
absl::StatusOr
Definition: abseil-cpp/absl/status/statusor.h:187
gpr_timespec
Definition: gpr_types.h:50
grpc_channel_stack_type_is_client
bool grpc_channel_stack_type_is_client(grpc_channel_stack_type type)
Definition: channel_stack_type.cc:23
googletest-break-on-failure-unittest.Run
def Run(command)
Definition: bloaty/third_party/googletest/googletest/test/googletest-break-on-failure-unittest.py:76
gpr_set_log_function
GPRAPI void gpr_set_log_function(gpr_log_func func)
Definition: log.cc:143
grpc_init
GRPCAPI void grpc_init(void)
Definition: init.cc:146
grpc_error
Definition: error_internal.h:42
grpc_pollset
Definition: bm_cq_multiple_threads.cc:37
grpc_transport_stream_op_batch
Definition: transport.h:284
grpc_core::HttpServerFilter::kFilter
static const grpc_channel_filter kFilter
Definition: http_server_filter.h:37
grpc_closure
Definition: closure.h:56
op
static grpc_op * op
Definition: test/core/fling/client.cc:47
grpc_endpoint
Definition: endpoint.h:105
grpc_shutdown
GRPCAPI void grpc_shutdown(void)
Definition: init.cc:209
final_info_
std::unique_ptr< filter_fuzzer::FinalInfo > final_info_
Definition: filter_fuzzer.cc:551
unset_incoming_server_initial_metadata_latch_
Latch< ServerMetadata * > * unset_incoming_server_initial_metadata_latch_
Definition: filter_fuzzer.cc:554
destroy
static std::function< void(void *, Slot *)> destroy
Definition: abseil-cpp/absl/container/internal/hash_policy_traits_test.cc:42
grpc_stream_refcount
Definition: transport.h:178
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
grpc_core::MaxAgeFilter::kFilter
static const grpc_channel_filter kFilter
Definition: channel_idle_filter.h:105
absl::exchange
T exchange(T &obj, U &&new_value)
Definition: abseil-cpp/absl/utility/utility.h:314
memory_allocator_
MemoryAllocator memory_allocator_
Definition: filter_fuzzer.cc:569
id
uint32_t id
Definition: flow_control_fuzzer.cc:70
next_check_call_host_qry_
uint32_t next_check_call_host_qry_
Definition: filter_fuzzer.cc:116
gpr_clock_type
gpr_clock_type
Definition: gpr_types.h:34
GRPC_ARG_TRANSPORT
#define GRPC_ARG_TRANSPORT
Definition: transport.h:71
legacy_context_
grpc_call_context_element legacy_context_[GRPC_CONTEXT_COUNT]
Definition: filter_fuzzer.cc:560


grpc
Author(s):
autogenerated on Fri May 16 2025 02:58:23