119 struct curl_sockaddr* address =
nullptr)
override;
126 void RunLoop(CURLM* multi, CURL* easy,
const curl::fuzzer::proto::Scenario& scenario)
override;
130 enum class ParseResult {
138 unsigned char tag = 0;
139 std::size_t value_offset = 0;
140 std::size_t value_length = 0;
141 std::size_t total_length = 0;
146 unsigned char op_tag = 0;
147 std::uint32_t message_id = 0;
148 std::size_t total_length = 0;
149 bool sasl_mechanism_query =
false;
153 static ParseResult ParseTlv(std::string_view bytes, std::size_t offset, TlvView* view);
156 static ParseResult ParseMessage(std::string_view bytes, MessageView* message);
159 static bool IsSaslMechanismSearch(std::string_view value);
161 static void AppendBerLength(std::string* out, std::size_t length);
163 static void AppendTlv(std::string* out,
unsigned char tag, std::string_view value);
165 static void AppendBerInteger(std::string* out, std::uint32_t value);
168 static void BuildResultMessage(std::uint32_t message_id,
unsigned char op_tag,
int result_code, std::string* out);
171 static void BuildSaslMechanismsEntry(std::uint32_t message_id, std::string* out);
174 static bool RewriteMessageId(std::string_view message, std::uint32_t message_id, std::string* out);
176 static bool MessageOpTag(std::string_view message,
unsigned char* op_tag);
178 void ResetForScenario(
const curl::fuzzer::proto::Scenario& scenario);
180 static void ApplyScriptBackpressure(MockConnection*
connection,
const curl::fuzzer::proto::Connection& script);
182 bool ServiceClientConnection();
184 void HandleClientMessage(
const MessageView& message);
186 void HandleBindRequest(std::uint32_t message_id);
188 void HandleSearchRequest(std::uint32_t message_id);
190 void HandleMechanismSearchRequest(std::uint32_t message_id);
192 void HandleStartTlsRequest(std::uint32_t message_id);
194 bool ReleaseNextServerChunk();
196 bool FinishSearchIfReady();
198 bool WriteServerBytes(std::string_view bytes);
200 static void CapturePrefix(std::string_view source, std::size_t limit, std::string* destination);
202 void FinishConnections();
207 static constexpr std::size_t kMaxClientMessageBytes = 64 * 1024;
210 static constexpr std::size_t kMaxCapturedMessageBytes = 64 * 1024;
213 static constexpr int kMaxMessagesPerService = 16;
216 const curl::fuzzer::proto::Scenario* scenario_;
218 std::size_t server_chunk_count_;
220 std::size_t next_server_chunk_;
221 std::size_t bind_request_count_;
222 std::size_t search_request_count_;
223 std::size_t mechanism_search_request_count_;
224 std::size_t starttls_request_count_;
225 std::size_t unbind_request_count_;
226 std::size_t server_message_count_;
227 std::size_t scripted_message_count_;
228 std::size_t synthesized_done_count_;
229 std::size_t scripted_bind_response_count_;
231 std::string pending_client_bytes_;
233 std::string packet_transcript_;
235 std::uint32_t search_message_id_;
239 bool search_done_sent_;
241 bool scripted_bind_consumed_;
243 bool release_script_chunks_;
247 bool protocol_error_;