fuzzer_utils.h
Go to the documentation of this file.
1 // Copyright 2021 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 #ifndef GRPC_TEST_CORE_TRANSPORT_BINDER_END2END_FUZZERS_FUZZER_UTILS_H
16 #define GRPC_TEST_CORE_TRANSPORT_BINDER_END2END_FUZZERS_FUZZER_UTILS_H
17 
18 #include <memory>
19 #include <queue>
20 #include <string>
21 #include <thread>
22 #include <vector>
23 
24 #include "absl/memory/memory.h"
25 #include "absl/status/status.h"
26 
27 #include <grpc/support/log.h>
28 
31 #include "test/core/transport/binder/end2end/fuzzers/binder_transport_fuzzer.pb.h"
32 
33 namespace grpc_binder {
34 namespace fuzzing {
35 
36 // A WritableParcel implementation that simply does nothing. Don't use
37 // MockWritableParcel here since capturing calls is expensive.
39  public:
40  int32_t GetDataSize() const override { return 0; }
41  absl::Status WriteInt32(int32_t /*data*/) override {
42  return absl::OkStatus();
43  }
44  absl::Status WriteInt64(int64_t /*data*/) override {
45  return absl::OkStatus();
46  }
47  absl::Status WriteBinder(HasRawBinder* /*binder*/) override {
48  return absl::OkStatus();
49  }
51  return absl::OkStatus();
52  }
53  absl::Status WriteByteArray(const int8_t* /*buffer*/,
54  int32_t /*length*/) override {
55  return absl::OkStatus();
56  }
57 };
58 
59 // Binder implementation used in fuzzing.
60 //
61 // Most of its the functionalities are no-op, except ConstructTxReceiver now
62 // returns a TransactionReceiverForFuzzing.
63 class BinderForFuzzing : public Binder {
64  public:
66 
67  explicit BinderForFuzzing(const binder_transport_fuzzer::IncomingParcels& p)
69 
70  void Initialize() override {}
72 
74  return absl::OkStatus();
75  }
76 
77  std::unique_ptr<TransactionReceiver> ConstructTxReceiver(
79  TransactionReceiver::OnTransactCb cb) const override;
80 
81  WritableParcel* GetWritableParcel() const override { return input_.get(); }
82  void* GetRawBinder() override { return nullptr; }
83 
84  private:
85  binder_transport_fuzzer::IncomingParcels incoming_parcels_;
86  std::unique_ptr<WritableParcel> input_;
87 };
88 
89 // ReadableParcel implementation used in fuzzing.
90 //
91 // It consumes a Parcel generated by mutator, and returns the data in the Parcel
92 // upon user's requests.
94  public:
95  explicit ReadableParcelForFuzzing(const binder_transport_fuzzer::Parcel& p)
96  : parcel_data_size_(p.data_size()), consumed_data_size_(0) {
97  for (const auto& v : p.values()) {
98  values_.push(v);
99  }
100  }
101 
102  // Construct from SetupTransportParcel, which have fixed types of data in it.
104  const binder_transport_fuzzer::SetupTransportParcel& p)
105  : parcel_data_size_(p.data_size()), consumed_data_size_(0) {
106  // Creates value for protocol version and put it into the queue
107  binder_transport_fuzzer::Value version_value;
108  version_value.set_i32(p.version());
109  values_.push(version_value);
110 
111  // Creates a binder value and put it into the queue
112  binder_transport_fuzzer::Value binder_value;
113  binder_value.mutable_binder(); // sets one-of field
114  values_.push(binder_value);
115  }
116 
117  int32_t GetDataSize() const override;
118  absl::Status ReadInt32(int32_t* data) override;
119  absl::Status ReadInt64(int64_t* data) override;
120  absl::Status ReadBinder(std::unique_ptr<Binder>* binder) override;
123 
124  private:
125  // Stores data/objects in binder in their order. Since we don't support random
126  // access using a std::queue is enough here.
127  std::queue<binder_transport_fuzzer::Value> values_;
128 
130 
131  static constexpr size_t kParcelDataSizeLimit = 1024 * 1024;
133 };
134 
135 void JoinFuzzingThread();
136 
137 // TransactionReceiver implementation used in fuzzing.
138 //
139 // When constructed, start sending fuzzed requests to the client. When all the
140 // bytes are consumed, the reference to WireReader will be released.
142  public:
144  binder_transport_fuzzer::IncomingParcels incoming_parcels,
145  grpc_core::RefCountedPtr<WireReader> wire_reader_ref,
147 
148  void* GetRawBinder() override { return nullptr; }
149 };
150 
151 } // namespace fuzzing
152 } // namespace grpc_binder
153 
154 #endif // GRPC_TEST_CORE_TRANSPORT_BINDER_END2END_FUZZERS_FUZZER_UTILS_H
grpc_binder::fuzzing::ReadableParcelForFuzzing::ReadByteArray
absl::Status ReadByteArray(std::string *data) override
Definition: fuzzer_utils.cc:84
log.h
grpc_binder::fuzzing::BinderForFuzzing::Initialize
void Initialize() override
Definition: fuzzer_utils.h:70
grpc_binder::fuzzing::JoinFuzzingThread
void JoinFuzzingThread()
Definition: fuzzer_utils.cc:32
grpc_binder::fuzzing::ReadableParcelForFuzzing::consumed_data_size_
size_t consumed_data_size_
Definition: fuzzer_utils.h:132
grpc_binder::fuzzing::BinderForFuzzing::Transact
absl::Status Transact(BinderTransportTxCode) override
Definition: fuzzer_utils.h:73
binder.h
grpc_binder::fuzzing::BinderForFuzzing::input_
std::unique_ptr< WritableParcel > input_
Definition: fuzzer_utils.h:86
absl::string_view
Definition: abseil-cpp/absl/strings/string_view.h:167
grpc_binder
Definition: connection_id_generator.cc:45
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
absl::OkStatus
Status OkStatus()
Definition: third_party/abseil-cpp/absl/status/status.h:882
absl::make_unique
memory_internal::MakeUniqueResult< T >::scalar make_unique(Args &&... args)
Definition: third_party/abseil-cpp/absl/memory/memory.h:168
grpc_binder::fuzzing::TransactionReceiverForFuzzing::TransactionReceiverForFuzzing
TransactionReceiverForFuzzing(binder_transport_fuzzer::IncomingParcels incoming_parcels, grpc_core::RefCountedPtr< WireReader > wire_reader_ref, TransactionReceiver::OnTransactCb cb)
Definition: fuzzer_utils.cc:136
grpc_binder::fuzzing::ReadableParcelForFuzzing::ReadableParcelForFuzzing
ReadableParcelForFuzzing(const binder_transport_fuzzer::Parcel &p)
Definition: fuzzer_utils.h:95
grpc_binder::fuzzing::ReadableParcelForFuzzing
Definition: fuzzer_utils.h:93
grpc_binder::BinderTransportTxCode
BinderTransportTxCode
Definition: binder_constants.h:31
wire_reader.h
grpc_binder::fuzzing::BinderForFuzzing
Definition: fuzzer_utils.h:63
grpc_binder::fuzzing::BinderForFuzzing::BinderForFuzzing
BinderForFuzzing()
Definition: fuzzer_utils.h:65
grpc_binder::fuzzing::BinderForFuzzing::incoming_parcels_
binder_transport_fuzzer::IncomingParcels incoming_parcels_
Definition: fuzzer_utils.h:85
grpc_binder::fuzzing::TransactionReceiverForFuzzing::GetRawBinder
void * GetRawBinder() override
Definition: fuzzer_utils.h:148
grpc_binder::TransactionReceiver
Definition: binder.h:77
grpc_binder::fuzzing::NoOpWritableParcel::WriteBinder
absl::Status WriteBinder(HasRawBinder *) override
Definition: fuzzer_utils.h:47
grpc_core::RefCountedPtr
Definition: ref_counted_ptr.h:35
grpc_binder::fuzzing::ReadableParcelForFuzzing::ReadableParcelForFuzzing
ReadableParcelForFuzzing(const binder_transport_fuzzer::SetupTransportParcel &p)
Definition: fuzzer_utils.h:103
int64_t
signed __int64 int64_t
Definition: stdint-msvc2008.h:89
grpc_binder::fuzzing::BinderForFuzzing::GetRawBinder
void * GetRawBinder() override
Definition: fuzzer_utils.h:82
grpc_binder::fuzzing::ReadableParcelForFuzzing::ReadBinder
absl::Status ReadBinder(std::unique_ptr< Binder > *binder) override
Definition: fuzzer_utils.cc:70
setup.v
v
Definition: third_party/bloaty/third_party/capstone/bindings/python/setup.py:42
grpc_binder::fuzzing::ReadableParcelForFuzzing::ReadInt32
absl::Status ReadInt32(int32_t *data) override
Definition: fuzzer_utils.cc:44
grpc_binder::fuzzing::ReadableParcelForFuzzing::kParcelDataSizeLimit
static constexpr size_t kParcelDataSizeLimit
Definition: fuzzer_utils.h:131
grpc_binder::fuzzing::ReadableParcelForFuzzing::values_
std::queue< binder_transport_fuzzer::Value > values_
Definition: fuzzer_utils.h:127
grpc_binder::fuzzing::BinderForFuzzing::PrepareTransaction
absl::Status PrepareTransaction() override
Definition: fuzzer_utils.h:71
grpc_binder::fuzzing::ReadableParcelForFuzzing::GetDataSize
int32_t GetDataSize() const override
Definition: fuzzer_utils.cc:40
grpc_binder::fuzzing::BinderForFuzzing::ConstructTxReceiver
std::unique_ptr< TransactionReceiver > ConstructTxReceiver(grpc_core::RefCountedPtr< WireReader > wire_reader_ref, TransactionReceiver::OnTransactCb cb) const override
Definition: fuzzer_utils.cc:145
data
char data[kBufferLength]
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1006
grpc_binder::fuzzing::NoOpWritableParcel::WriteInt32
absl::Status WriteInt32(int32_t) override
Definition: fuzzer_utils.h:41
grpc_binder::fuzzing::NoOpWritableParcel::WriteByteArray
absl::Status WriteByteArray(const int8_t *, int32_t) override
Definition: fuzzer_utils.h:53
grpc_binder::WritableParcel
Definition: binder.h:44
grpc_binder::fuzzing::BinderForFuzzing::GetWritableParcel
WritableParcel * GetWritableParcel() const override
Definition: fuzzer_utils.h:81
grpc_binder::fuzzing::BinderForFuzzing::BinderForFuzzing
BinderForFuzzing(const binder_transport_fuzzer::IncomingParcels &p)
Definition: fuzzer_utils.h:67
grpc_binder::fuzzing::NoOpWritableParcel::WriteInt64
absl::Status WriteInt64(int64_t) override
Definition: fuzzer_utils.h:44
grpc_binder::TransactionReceiver::OnTransactCb
std::function< absl::Status(transaction_code_t, ReadableParcel *, int uid)> OnTransactCb
Definition: binder.h:80
grpc_binder::fuzzing::NoOpWritableParcel::GetDataSize
int32_t GetDataSize() const override
Definition: fuzzer_utils.h:40
absl::Status
Definition: third_party/abseil-cpp/absl/status/status.h:424
grpc_binder::fuzzing::ReadableParcelForFuzzing::parcel_data_size_
const int32_t parcel_data_size_
Definition: fuzzer_utils.h:129
grpc_binder::fuzzing::NoOpWritableParcel::WriteString
absl::Status WriteString(absl::string_view) override
Definition: fuzzer_utils.h:50
grpc_binder::fuzzing::TransactionReceiverForFuzzing
Definition: fuzzer_utils.h:141
absl
Definition: abseil-cpp/absl/algorithm/algorithm.h:31
grpc_binder::HasRawBinder
Definition: binder.h:33
int8_t
signed char int8_t
Definition: stdint-msvc2008.h:75
Value
struct Value Value
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/protobuf.h:676
grpc_binder::ReadableParcel
Definition: binder.h:66
grpc_binder::Binder
Definition: binder.h:87
int32_t
signed int int32_t
Definition: stdint-msvc2008.h:77
grpc_binder::fuzzing::NoOpWritableParcel
Definition: fuzzer_utils.h:38
cb
OPENSSL_EXPORT pem_password_cb * cb
Definition: pem.h:351
grpc_binder::fuzzing::ReadableParcelForFuzzing::ReadString
absl::Status ReadString(std::string *data) override
Definition: fuzzer_utils.cc:97
grpc_binder::fuzzing::ReadableParcelForFuzzing::ReadInt64
absl::Status ReadInt64(int64_t *data) override
Definition: fuzzer_utils.cc:57


grpc
Author(s):
autogenerated on Thu Mar 13 2025 02:59:23