diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml new file mode 100644 index 00000000..83e45a1e --- /dev/null +++ b/.github/workflows/cifuzz.yml @@ -0,0 +1,26 @@ +name: CIFuzz +on: [pull_request] +jobs: + Fuzzing: + runs-on: ubuntu-latest + steps: + - name: Build Fuzzers + id: build + uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master + with: + oss-fuzz-project-name: 'burntsushi-toml' + dry-run: false + language: go + - name: Run Fuzzers + uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master + with: + oss-fuzz-project-name: 'burntsushi-toml' + fuzz-seconds: 300 + dry-run: false + language: go + - name: Upload Crash + uses: actions/upload-artifact@v4 + if: failure() && steps.build.outcome == 'success' + with: + name: artifacts + path: ./out/artifacts diff --git a/ossfuzz/fuzz.go b/ossfuzz/fuzz.go new file mode 100644 index 00000000..6a29773d --- /dev/null +++ b/ossfuzz/fuzz.go @@ -0,0 +1,34 @@ +package ossfuzz + +import ( + "bytes" + "fmt" + + "github.com/BurntSushi/toml" +) + +func FuzzToml(data []byte) int { + if len(data) >= 2048 { + return 0 + } + + var v any + _, err := toml.Decode(string(data), &v) + if err != nil { + return 0 + } + + buf := new(bytes.Buffer) + err = toml.NewEncoder(buf).Encode(v) + if err != nil { + panic(fmt.Sprintf("failed to encode decoded document: %s", err)) + } + + var v2 any + _, err = toml.Decode(buf.String(), &v2) + if err != nil { + panic(fmt.Sprintf("failed round trip: %s", err)) + } + + return 1 +}