diff options
author | Devtools Arcadia <[email protected]> | 2022-02-07 18:08:42 +0300 |
---|---|---|
committer | Devtools Arcadia <[email protected]> | 2022-02-07 18:08:42 +0300 |
commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/blockcodecs/fuzz |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/blockcodecs/fuzz')
-rw-r--r-- | library/cpp/blockcodecs/fuzz/main.cpp | 84 | ||||
-rw-r--r-- | library/cpp/blockcodecs/fuzz/proto/case.proto | 10 | ||||
-rw-r--r-- | library/cpp/blockcodecs/fuzz/proto/ya.make | 14 | ||||
-rw-r--r-- | library/cpp/blockcodecs/fuzz/ya.make | 23 |
4 files changed, 131 insertions, 0 deletions
diff --git a/library/cpp/blockcodecs/fuzz/main.cpp b/library/cpp/blockcodecs/fuzz/main.cpp new file mode 100644 index 00000000000..763c6c5a10b --- /dev/null +++ b/library/cpp/blockcodecs/fuzz/main.cpp @@ -0,0 +1,84 @@ +#include <contrib/libs/protobuf-mutator/src/libfuzzer/libfuzzer_macro.h> +#include <google/protobuf/stubs/logging.h> + +#include <library/cpp/blockcodecs/codecs.h> +#include <library/cpp/blockcodecs/fuzz/proto/case.pb.h> +#include <library/cpp/blockcodecs/stream.h> + +#include <util/stream/input.h> +#include <util/stream/length.h> +#include <util/stream/mem.h> +#include <util/stream/null.h> +#include <util/stream/str.h> + +using NBlockCodecs::NFuzz::TPackUnpackCase; +using NBlockCodecs::TCodedOutput; +using NBlockCodecs::TDecodedInput; + +static void ValidateBufferSize(const ui32 size) { + Y_ENSURE(size > 0 && size <= 16ULL * 1024); +} + +static void DoOnlyDecode(const TPackUnpackCase& case_) { + if (!case_.GetPacked()) { + return; + } + + TMemoryInput mi(case_.GetData().data(), case_.GetData().size()); + TDecodedInput di(&mi); + TNullOutput no; + TCountingOutput cno(&no); + TransferData(&di, &cno); +} + +static void DoDecodeEncode(const TPackUnpackCase& case_) { + auto* const codec = NBlockCodecs::Codec(case_.GetCodecName()); + Y_ENSURE(codec); + + TMemoryInput mi(case_.GetData().data(), case_.GetData().size()); + TDecodedInput di(&mi, codec); + TStringStream decoded; + TransferData(&di, &decoded); + TNullOutput no; + TCountingOutput cno(&no); + TCodedOutput co(&cno, codec, case_.GetBufferLength()); + TransferData(&decoded, &co); + co.Flush(); + + Y_VERIFY((case_.GetData().size() > 0) == (cno.Counter() > 0)); + Y_VERIFY((case_.GetData().size() > 0) == (decoded.Str().size() > 0)); +} + +static void DoEncodeDecode(const TPackUnpackCase& case_) { + auto* const codec = NBlockCodecs::Codec(case_.GetCodecName()); + Y_ENSURE(codec); + + TMemoryInput mi(case_.GetData().data(), case_.GetData().size()); + TStringStream encoded; + TCodedOutput co(&encoded, codec, case_.GetBufferLength()); + TransferData(&mi, &co); + co.Flush(); + TStringStream decoded; + TDecodedInput di(&encoded, codec); + TransferData(&di, &decoded); + + Y_VERIFY((case_.GetData().size() > 0) == (encoded.Str().size() > 0)); + Y_VERIFY(case_.GetData() == decoded.Str()); +} + +DEFINE_BINARY_PROTO_FUZZER(const TPackUnpackCase& case_) { + try { + if (!case_.GetCodecName()) { + DoOnlyDecode(case_); + return; + } + + ValidateBufferSize(case_.GetBufferLength()); + if (case_.GetPacked()) { + DoDecodeEncode(case_); + } else { + DoEncodeDecode(case_); + } + } catch (const std::exception&) { + } +} diff --git a/library/cpp/blockcodecs/fuzz/proto/case.proto b/library/cpp/blockcodecs/fuzz/proto/case.proto new file mode 100644 index 00000000000..85518b0da9e --- /dev/null +++ b/library/cpp/blockcodecs/fuzz/proto/case.proto @@ -0,0 +1,10 @@ +syntax="proto3"; + +package NBlockCodecs.NFuzz; + +message TPackUnpackCase { + bool Packed = 1; + uint32 BufferLength = 2; + string CodecName = 3; + bytes Data = 4; +} diff --git a/library/cpp/blockcodecs/fuzz/proto/ya.make b/library/cpp/blockcodecs/fuzz/proto/ya.make new file mode 100644 index 00000000000..da840bc8c93 --- /dev/null +++ b/library/cpp/blockcodecs/fuzz/proto/ya.make @@ -0,0 +1,14 @@ +OWNER( + yazevnul + g:util +) + +PROTO_LIBRARY() + +SRCS( + case.proto +) + +EXCLUDE_TAGS(GO_PROTO) + +END() diff --git a/library/cpp/blockcodecs/fuzz/ya.make b/library/cpp/blockcodecs/fuzz/ya.make new file mode 100644 index 00000000000..bc8becc9e1d --- /dev/null +++ b/library/cpp/blockcodecs/fuzz/ya.make @@ -0,0 +1,23 @@ +OWNER( + pg + g:util +) + +IF (NOT MSVC) + FUZZ() + + SIZE(MEDIUM) + + SRCS( + main.cpp + ) + + PEERDIR( + contrib/libs/protobuf + contrib/libs/protobuf-mutator + library/cpp/blockcodecs + library/cpp/blockcodecs/fuzz/proto + ) + + END() +ENDIF() |