aboutsummaryrefslogtreecommitdiff
path: root/libgo/go/image/png
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2019-09-06 18:12:46 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2019-09-06 18:12:46 +0000
commitaa8901e9bb0399d2c16f988ba2fe46eb0c0c5d13 (patch)
tree7e63b06d1eec92beec6997c9d3ab47a5d6a835be /libgo/go/image/png
parent920ea3b8ba3164b61ac9490dfdfceb6936eda6dd (diff)
downloadgcc-aa8901e9bb0399d2c16f988ba2fe46eb0c0c5d13.zip
gcc-aa8901e9bb0399d2c16f988ba2fe46eb0c0c5d13.tar.gz
gcc-aa8901e9bb0399d2c16f988ba2fe46eb0c0c5d13.tar.bz2
libgo: update to Go 1.13beta1 release
Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/193497 From-SVN: r275473
Diffstat (limited to 'libgo/go/image/png')
-rw-r--r--libgo/go/image/png/fuzz.go52
-rw-r--r--libgo/go/image/png/reader.go2
-rw-r--r--libgo/go/image/png/reader_test.go15
-rw-r--r--libgo/go/image/png/testdata/invalid-palette.pngbin0 -> 1122 bytes
-rw-r--r--libgo/go/image/png/writer.go1
5 files changed, 68 insertions, 2 deletions
diff --git a/libgo/go/image/png/fuzz.go b/libgo/go/image/png/fuzz.go
new file mode 100644
index 0000000..d9cb392
--- /dev/null
+++ b/libgo/go/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.
+
+// +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
+}
diff --git a/libgo/go/image/png/reader.go b/libgo/go/image/png/reader.go
index 53fbf3e..6771973 100644
--- a/libgo/go/image/png/reader.go
+++ b/libgo/go/image/png/reader.go
@@ -706,7 +706,7 @@ func (d *decoder) readImagePass(r io.Reader, pass int, allocateOnly bool) (image
}
}
case cbP8:
- if len(paletted.Palette) != 255 {
+ if len(paletted.Palette) != 256 {
for x := 0; x < width; x++ {
if len(paletted.Palette) <= int(cdat[x]) {
paletted.Palette = paletted.Palette[:int(cdat[x])+1]
diff --git a/libgo/go/image/png/reader_test.go b/libgo/go/image/png/reader_test.go
index 33dcd3d..3325d2e 100644
--- a/libgo/go/image/png/reader_test.go
+++ b/libgo/go/image/png/reader_test.go
@@ -584,6 +584,21 @@ func TestUnknownChunkLengthUnderflow(t *testing.T) {
}
}
+func TestPaletted8OutOfRangePixel(t *testing.T) {
+ // IDAT contains a reference to a palette index that does not exist in the file.
+ img, err := readPNG("testdata/invalid-palette.png")
+ if err != nil {
+ t.Errorf("decoding invalid-palette.png: unexpected error %v", err)
+ return
+ }
+
+ // Expect that the palette is extended with opaque black.
+ want := color.RGBA{0x00, 0x00, 0x00, 0xff}
+ if got := img.At(15, 15); got != want {
+ t.Errorf("got %F %v, expected %T %v", got, got, want, want)
+ }
+}
+
func TestGray8Transparent(t *testing.T) {
// These bytes come from https://golang.org/issues/19553
m, err := Decode(bytes.NewReader([]byte{
diff --git a/libgo/go/image/png/testdata/invalid-palette.png b/libgo/go/image/png/testdata/invalid-palette.png
new file mode 100644
index 0000000..a747e59
--- /dev/null
+++ b/libgo/go/image/png/testdata/invalid-palette.png
Binary files differ
diff --git a/libgo/go/image/png/writer.go b/libgo/go/image/png/writer.go
index c033351..2bd4fde 100644
--- a/libgo/go/image/png/writer.go
+++ b/libgo/go/image/png/writer.go
@@ -288,7 +288,6 @@ func filter(cr *[nFilter][]byte, pr []byte, bpp int) int {
}
}
if sum < best {
- best = sum
filter = ftAverage
}