image/tiff: Do not panic when RowsPerStrip is missing.

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
This commit is contained in:
Benny Siegert 2011-07-28 11:15:59 +10:00 committed by Nigel Tao
parent 890bdc5339
commit a65f4ccb89
3 changed files with 29 additions and 0 deletions

View 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")

View File

@ -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)
}
}

BIN
src/pkg/image/tiff/testdata/no_rps.tiff vendored Normal file

Binary file not shown.