diff --git a/internal/png/gen.go b/internal/png/gen.go index 2c547e580..484c2256c 100644 --- a/internal/png/gen.go +++ b/internal/png/gen.go @@ -32,6 +32,7 @@ import ( ) func run() error { + // TODO: Use go/packages with specifying build tags so that stdlibfuzz can be avoided. dir := filepath.Join(runtime.GOROOT(), "src", "image", "png") files, err := ioutil.ReadDir(dir) diff --git a/internal/png/stdlibfuzz.go b/internal/png/stdlibfuzz.go new file mode 100644 index 000000000..263b0a467 --- /dev/null +++ b/internal/png/stdlibfuzz.go @@ -0,0 +1,54 @@ +// Code generated by gen.go. DO NOT EDIT. + +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build gofuzz + +package png + +import ( + "bytes" + "fmt" +) + +func Fuzz(data []byte) int { + cfg, err := DecodeConfig(bytes.NewReader(data)) + if err != nil { + return 0 + } + if cfg.Width*cfg.Height > 1e6 { + return 0 + } + img, err := Decode(bytes.NewReader(data)) + if err != nil { + return 0 + } + levels := []CompressionLevel{ + DefaultCompression, + NoCompression, + BestSpeed, + BestCompression, + } + for _, l := range levels { + var w bytes.Buffer + e := &Encoder{CompressionLevel: l} + err = e.Encode(&w, img) + if err != nil { + panic(err) + } + img1, err := Decode(&w) + if err != nil { + panic(err) + } + got := img1.Bounds() + want := img.Bounds() + if !got.Eq(want) { + fmt.Printf("bounds0: %#v\n", want) + fmt.Printf("bounds1: %#v\n", got) + panic("bounds have changed") + } + } + return 1 +}