17namespace proto_fuzzer {
22template <
typename RepeatedField>
23void TrimRepeated(RepeatedField* field, std::size_t limit) {
24 const std::size_t size =
static_cast<std::size_t
>(field->size());
26 field->DeleteSubrange(
static_cast<int>(limit),
static_cast<int>(size - limit));
33bool BoundTelnetFragment(std::string* fragment, std::size_t* bytes_left, std::size_t* controls_left) {
34 std::size_t retained = 0;
35 while (retained < fragment->size() && retained < *bytes_left) {
36 if (
static_cast<unsigned char>((*fragment)[retained]) == 0xff) {
37 if (*controls_left == 0) {
45 const bool complete = retained == fragment->size();
46 fragment->resize(retained);
47 *bytes_left -= retained;
63 if (connection ==
nullptr) {
71 if (!BoundTelnetFragment(connection->mutable_initial_response(), &bytes_left, &controls_left)) {
72 connection->clear_on_readable();
76 int retained_chunks = 0;
77 for (; retained_chunks < connection->on_readable_size(); ++retained_chunks) {
78 std::string* fragment = connection->mutable_on_readable(retained_chunks);
79 if (!BoundTelnetFragment(fragment, &bytes_left, &controls_left)) {
83 if (!fragment->empty()) {
90 auto* chunks = connection->mutable_on_readable();
91 if (retained_chunks < chunks->size()) {
92 chunks->DeleteSubrange(retained_chunks, chunks->size() - retained_chunks);
Shared complexity limits for structured scenarios.
constexpr std::size_t kMaxTelnetControlBytes
Bound reply amplification as well as input bytes.
constexpr std::size_t kMaxTelnetResponseBytes
TELNET consumes the peer synchronously, so only this bounded prefix can be preloaded before curl ente...
constexpr std::size_t kMaxTelnetResponseChunks
Raw fragments are all preloaded before TELNET starts.
void BoundTelnetResponse(curl::fuzzer::proto::Connection *connection)
Retain the response prefix that TelnetMockServer can preload safely.
Shared TELNET response normalization.