]> Cypherpunks repositories - gostls13.git/commitdiff
image/tiff: Do not panic when RowsPerStrip is missing.
authorBenny Siegert <bsiegert@gmail.com>
Thu, 28 Jul 2011 01:15:59 +0000 (11:15 +1000)
committerNigel Tao <nigeltao@golang.org>
Thu, 28 Jul 2011 01:15:59 +0000 (11:15 +1000)
The RowsPerStrip tag is mandatory according to the spec. However,
Mac OS sometimes (?) omits it. I managed to create such an image
by applying "tiffutil -none" on a compressed image.

If RowsPerStrip is 0, there was a division by zero in the decoder.
Assume that the image is a single strip in this case.

R=nigeltao, bradfitz
CC=golang-dev
https://golang.org/cl/4815061

src/pkg/image/tiff/reader.go
src/pkg/image/tiff/reader_test.go [new file with mode: 0644]
src/pkg/image/tiff/testdata/no_rps.tiff [new file with mode: 0644]

index 26e52144d468692d9350f0595839f8e8ef4d475d..f5652667aa394458318bf9dada3a3d6e26862794 100644 (file)
@@ -362,6 +362,10 @@ func Decode(r io.Reader) (img image.Image, err os.Error) {
 
        // Check if we have the right number of strips, offsets and counts.
        rps := int(d.firstVal(tRowsPerStrip))
+       if rps == 0 {
+               // Assume only one strip.
+               rps = d.config.Height
+       }
        numStrips := (d.config.Height + rps - 1) / rps
        if rps == 0 || len(d.features[tStripOffsets]) < numStrips || len(d.features[tStripByteCounts]) < numStrips {
                return nil, FormatError("inconsistent header")
diff --git a/src/pkg/image/tiff/reader_test.go b/src/pkg/image/tiff/reader_test.go
new file mode 100644 (file)
index 0000000..f2122c4
--- /dev/null
@@ -0,0 +1,25 @@
+// Copyright 2011 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.
+
+package tiff
+
+import (
+       "os"
+       "testing"
+)
+
+// TestNoRPS tries to decode an image that has no RowsPerStrip tag.
+// The tag is mandatory according to the spec but some software omits
+// it in the case of a single strip.
+func TestNoRPS(t *testing.T) {
+       f, err := os.Open("testdata/no_rps.tiff")
+       if err != nil {
+               t.Fatal(err)
+       }
+       defer f.Close()
+       _, err = Decode(f)
+       if err != nil {
+               t.Fatal(err)
+       }
+}
diff --git a/src/pkg/image/tiff/testdata/no_rps.tiff b/src/pkg/image/tiff/testdata/no_rps.tiff
new file mode 100644 (file)
index 0000000..3280cf8
Binary files /dev/null and b/src/pkg/image/tiff/testdata/no_rps.tiff differ