From e4cd592f77cfca7ff279b6bd4522cc5c5bfccae7 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Wed, 18 Oct 2023 09:53:04 +0200 Subject: [PATCH] tests/fuzzers: simplify bitutil fuzzer --- oss-fuzz.sh | 3 +- tests/fuzzers/bitutil/compress_fuzz.go | 70 -------------------------- tests/fuzzers/bitutil/compress_test.go | 48 ++++++++++++++++-- 3 files changed, 47 insertions(+), 74 deletions(-) delete mode 100644 tests/fuzzers/bitutil/compress_fuzz.go diff --git a/oss-fuzz.sh b/oss-fuzz.sh index 405ebb87e2..55660d08e3 100644 --- a/oss-fuzz.sh +++ b/oss-fuzz.sh @@ -92,7 +92,8 @@ function compile_fuzzer() { cd - } -compile_fuzzer tests/fuzzers/bitutil Fuzz fuzzBitutilCompress +compile_fuzzer tests/fuzzers/bitutil FuzzEncoder fuzzBitutilEncoder +compile_fuzzer tests/fuzzers/bitutil FuzzDecoder fuzzBitutilDecoder compile_fuzzer tests/fuzzers/bn256 FuzzAdd fuzzBn256Add compile_fuzzer tests/fuzzers/bn256 FuzzMul fuzzBn256Mul compile_fuzzer tests/fuzzers/bn256 FuzzPair fuzzBn256Pair diff --git a/tests/fuzzers/bitutil/compress_fuzz.go b/tests/fuzzers/bitutil/compress_fuzz.go deleted file mode 100644 index 9ddb63f5fb..0000000000 --- a/tests/fuzzers/bitutil/compress_fuzz.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package bitutil - -import ( - "bytes" - - "github.com/ethereum/go-ethereum/common/bitutil" -) - -// FuzzBitutil implements a go-fuzz fuzzer method to test various encoding method -// invocations. -func FuzzBitutil(data []byte) int { - if len(data) == 0 { - return 0 - } - if data[0]%2 == 0 { - return fuzzEncode(data[1:]) - } - return fuzzDecode(data[1:]) -} - -// fuzzEncode implements a go-fuzz fuzzer method to test the bitset encoding and -// decoding algorithm. -func fuzzEncode(data []byte) int { - proc, _ := bitutil.DecompressBytes(bitutil.CompressBytes(data), len(data)) - if !bytes.Equal(data, proc) { - panic("content mismatch") - } - return 1 -} - -// fuzzDecode implements a go-fuzz fuzzer method to test the bit decoding and -// reencoding algorithm. -func fuzzDecode(data []byte) int { - blob, err := bitutil.DecompressBytes(data, 1024) - if err != nil { - return 0 - } - // re-compress it (it's OK if the re-compressed differs from the - // original - the first input may not have been compressed at all) - comp := bitutil.CompressBytes(blob) - if len(comp) > len(blob) { - // After compression, it must be smaller or equal - panic("bad compression") - } - // But decompressing it once again should work - decomp, err := bitutil.DecompressBytes(data, 1024) - if err != nil { - panic(err) - } - if !bytes.Equal(decomp, blob) { - panic("content mismatch") - } - return 1 -} diff --git a/tests/fuzzers/bitutil/compress_test.go b/tests/fuzzers/bitutil/compress_test.go index 3207c9baf3..cbfc0b3d44 100644 --- a/tests/fuzzers/bitutil/compress_test.go +++ b/tests/fuzzers/bitutil/compress_test.go @@ -16,10 +16,52 @@ package bitutil -import "testing" +import ( + "testing" -func Fuzz(f *testing.F) { + "github.com/ethereum/go-ethereum/common/bitutil" +) + +func FuzzEncoder(f *testing.F) { f.Fuzz(func(t *testing.T, data []byte) { - FuzzBitutil(data) + fuzzEncode(data) }) } +func FuzzDecoder(f *testing.F) { + f.Fuzz(func(t *testing.T, data []byte) { + fuzzDecode(data) + }) +} + +// fuzzEncode implements a go-fuzz fuzzer method to test the bitset encoding and +// decoding algorithm. +func fuzzEncode(data []byte) { + proc, _ := bitutil.DecompressBytes(bitutil.CompressBytes(data), len(data)) + if !bytes.Equal(data, proc) { + panic("content mismatch") + } +} + +// fuzzDecode implements a go-fuzz fuzzer method to test the bit decoding and +// reencoding algorithm. +func fuzzDecode(data []byte) { + blob, err := bitutil.DecompressBytes(data, 1024) + if err != nil { + return + } + // re-compress it (it's OK if the re-compressed differs from the + // original - the first input may not have been compressed at all) + comp := bitutil.CompressBytes(blob) + if len(comp) > len(blob) { + // After compression, it must be smaller or equal + panic("bad compression") + } + // But decompressing it once again should work + decomp, err := bitutil.DecompressBytes(data, 1024) + if err != nil { + panic(err) + } + if !bytes.Equal(decomp, blob) { + panic("content mismatch") + } +}