diff options
Diffstat (limited to 'src/image/png/fuzz.go')
-rw-r--r-- | src/image/png/fuzz.go | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/image/png/fuzz.go b/src/image/png/fuzz.go new file mode 100644 index 0000000..688b6c9 --- /dev/null +++ b/src/image/png/fuzz.go @@ -0,0 +1,52 @@ +// 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. + +//go: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 +} |