diff --git a/fuzz/fuzz.patch b/fuzz/fuzz.patch new file mode 100644 index 000000000000..995b0d5b53e5 --- /dev/null +++ b/fuzz/fuzz.patch @@ -0,0 +1,81 @@ +diff --git a/types/address_test.go b/types/address_test.go +index 014a48b73..99f9a1a86 100644 +--- a/types/address_test.go ++++ b/types/address_test.go +@@ -26,10 +26,6 @@ type addressTestSuite struct { + suite.Suite + } + +-func TestAddressTestSuite(t *testing.T) { +- suite.Run(t, new(addressTestSuite)) +-} +- + func (s *addressTestSuite) SetupSuite() { + s.T().Parallel() + } +@@ -403,65 +399,6 @@ func (s *addressTestSuite) TestAddressInterface() { + } + } + +-func (s *addressTestSuite) TestBech32ifyAddressBytes() { +- type args struct { +- prefix string +- bs []byte +- } +- tests := []struct { +- name string +- args args +- want string +- wantErr bool +- }{ +- {"empty address", args{"prefixa", []byte{}}, "", false}, +- {"empty prefix", args{"", addr20byte}, "", true}, +- {"10-byte address", args{"prefixa", addr10byte}, "prefixa1qqqsyqcyq5rqwzqf3953cc", false}, +- {"10-byte address", args{"prefixb", addr10byte}, "prefixb1qqqsyqcyq5rqwzqf20xxpc", false}, +- {"20-byte address", args{"prefixa", addr20byte}, "prefixa1qqqsyqcyq5rqwzqfpg9scrgwpugpzysn7hzdtn", false}, +- {"20-byte address", args{"prefixb", addr20byte}, "prefixb1qqqsyqcyq5rqwzqfpg9scrgwpugpzysnrujsuw", false}, +- } +- for _, tt := range tests { +- s.T().Run(tt.name, func(t *testing.T) { +- got, err := types.Bech32ifyAddressBytes(tt.args.prefix, tt.args.bs) +- if (err != nil) != tt.wantErr { +- t.Errorf("Bech32ifyBytes() error = %v, wantErr %v", err, tt.wantErr) +- return +- } +- require.Equal(t, tt.want, got) +- }) +- } +-} +- +-func (s *addressTestSuite) TestMustBech32ifyAddressBytes() { +- type args struct { +- prefix string +- bs []byte +- } +- tests := []struct { +- name string +- args args +- want string +- wantPanic bool +- }{ +- {"empty address", args{"prefixa", []byte{}}, "", false}, +- {"empty prefix", args{"", addr20byte}, "", true}, +- {"10-byte address", args{"prefixa", addr10byte}, "prefixa1qqqsyqcyq5rqwzqf3953cc", false}, +- {"10-byte address", args{"prefixb", addr10byte}, "prefixb1qqqsyqcyq5rqwzqf20xxpc", false}, +- {"20-byte address", args{"prefixa", addr20byte}, "prefixa1qqqsyqcyq5rqwzqfpg9scrgwpugpzysn7hzdtn", false}, +- {"20-byte address", args{"prefixb", addr20byte}, "prefixb1qqqsyqcyq5rqwzqfpg9scrgwpugpzysnrujsuw", false}, +- } +- for _, tt := range tests { +- s.T().Run(tt.name, func(t *testing.T) { +- if tt.wantPanic { +- require.Panics(t, func() { types.MustBech32ifyAddressBytes(tt.args.prefix, tt.args.bs) }) +- return +- } +- require.Equal(t, tt.want, types.MustBech32ifyAddressBytes(tt.args.prefix, tt.args.bs)) +- }) +- } +-} +- + func (s *addressTestSuite) TestAddressTypesEquals() { + addr1 := secp256k1.GenPrivKey().PubKey().Address() + accAddr1 := types.AccAddress(addr1) diff --git a/fuzz/oss-fuzz-build.sh b/fuzz/oss-fuzz-build.sh index faa7c76b5d7b..c829194dc2e4 100644 --- a/fuzz/oss-fuzz-build.sh +++ b/fuzz/oss-fuzz-build.sh @@ -1,5 +1,34 @@ #!/bin/bash +set -o nounset +set -o pipefail +set -o errexit +set -x + +cd $SRC +wget https://go.dev/dl/go1.23.1.linux-amd64.tar.gz +mkdir $SRC/new-go +rm -rf /root/.go && tar -C $SRC/new-go/ -xzf go1.23.1.linux-amd64.tar.gz +mv $SRC/new-go/go /root/.go +ls /root/.go + +cd $SRC/go-118-fuzz-build +go build . +mv go-118-fuzz-build /root/go/bin/ +cd $SRC/cosmos-sdk +git apply ./fuzz/fuzz.patch + +mkdir $SRC/cosmos-sdk/types/fuzzing +mv $SRC/cosmos-sdk/types/address*_test.go $SRC/cosmos-sdk/types/fuzzing/ +sed 's/package types_test/package fuzzing/g' -i "$SRC"/cosmos-sdk/types/fuzzing/* + +rm $SRC/cosmos-sdk/math/dec_internal_test.go +rm $SRC/cosmos-sdk/math/int_internal_test.go +rm $SRC/cosmos-sdk/math/uint_internal_test.go +mv $SRC/cosmos-sdk/types/fuzz_test.go $SRC/cosmos-sdk/types/fuzz.go +rm $SRC/cosmos-sdk/types/*_test.go +mv $SRC/cosmos-sdk/types/fuzz.go $SRC/cosmos-sdk/types/fuzz_test.go + set -euo pipefail export FUZZ_ROOT="github.com/cosmos/cosmos-sdk" @@ -18,25 +47,22 @@ build_go_fuzzer() { compile_native_go_fuzzer cosmossdk.io/math FuzzLegacyNewDecFromStr fuzz_math_legacy_new_dec_from_str ) -go get github.com/AdamKorcz/go-118-fuzz-build/testing +printf "package types \nimport _ \"github.com/AdamKorcz/go-118-fuzz-build/testing\"\n" > ./types/fuzz-register.go +go mod edit -replace github.com/AdamKorcz/go-118-fuzz-build=$SRC/go-118-fuzz-build +go mod tidy # TODO: fails to build with # main.413864645.go:12:2: found packages query (collections_pagination.go) and query_test (fuzz_test.go_fuzz.go) in /src/cosmos-sdk/types/query # because of the separate query_test package. # compile_native_go_fuzzer "$FUZZ_ROOT"/types/query FuzzPagination fuzz_types_query_pagination compile_native_go_fuzzer "$FUZZ_ROOT"/types FuzzCoinUnmarshalJSON fuzz_types_coin_unmarshal_json -compile_native_go_fuzzer "$FUZZ_ROOT"/types FuzzBech32AccAddrConsistencyYAML fuzz_types_bech32_acc_addr_consistency_yaml - +compile_native_go_fuzzer "$FUZZ_ROOT"/types/fuzzing FuzzBech32AccAddrConsistencyYAML fuzz_types_bech32_acc_addr_consistency_yaml build_go_fuzzer FuzzCryptoHDDerivePrivateKeyForPath fuzz_crypto_hd_deriveprivatekeyforpath build_go_fuzzer FuzzCryptoHDNewParamsFromPath fuzz_crypto_hd_newparamsfrompath - build_go_fuzzer FuzzCryptoTypesCompactbitarrayMarshalUnmarshal fuzz_crypto_types_compactbitarray_marshalunmarshal - build_go_fuzzer FuzzTendermintAminoDecodeTime fuzz_tendermint_amino_decodetime - build_go_fuzzer FuzzTypesParseCoin fuzz_types_parsecoin build_go_fuzzer FuzzTypesParseDecCoin fuzz_types_parsedeccoin build_go_fuzzer FuzzTypesParseTimeBytes fuzz_types_parsetimebytes build_go_fuzzer FuzzTypesDecSetString fuzz_types_dec_setstring - build_go_fuzzer FuzzUnknownProto fuzz_unknownproto