diff --git a/ci.sh b/ci.sh index d916c5f..05c76f2 100755 --- a/ci.sh +++ b/ci.sh @@ -77,7 +77,7 @@ cover() { pushd "$dir" go test -covermode=atomic -coverpkg=./... -coverprofile=coverage.out.tmp ./... - cat coverage.out.tmp | grep -v testsuite | grep -v tomltestgen | grep -v gotoml-test-decoder > coverage.out + cat coverage.out.tmp | grep -v fuzz | grep -v testsuite | grep -v tomltestgen | grep -v gotoml-test-decoder > coverage.out go tool cover -func=coverage.out popd diff --git a/ossfuzz/fuzz.go b/ossfuzz/fuzz.go new file mode 100644 index 0000000..afe7cc6 --- /dev/null +++ b/ossfuzz/fuzz.go @@ -0,0 +1,45 @@ +//go:build go1.18 || go1.19 || go1.20 +// +build go1.18 go1.19 go1.20 + +package ossfuzz + +import ( + "fmt" + "reflect" + "strings" + + "github.com/pelletier/go-toml/v2" +) + +func FuzzToml(data []byte) int { + if len(data) >= 10240 { + return 0 + } + + if strings.Contains(string(data), "nan") { + return 0 + } + + var v interface{} + err := toml.Unmarshal(data, &v) + if err != nil { + return 0 + } + + encoded, err := toml.Marshal(v) + if err != nil { + panic(fmt.Sprintf("failed to marshal unmarshaled document: %s", err)) + } + + var v2 interface{} + err = toml.Unmarshal(encoded, &v2) + if err != nil { + panic(fmt.Sprintf("failed round trip: %s", err)) + } + + if !reflect.DeepEqual(v, v2) { + panic(fmt.Sprintf("not equal: %#+v %#+v", v, v2)) + } + + return 1 +}