mirror of
https://github.com/golang/go
synced 2024-11-22 02:34:40 -07:00
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:
parent
890bdc5339
commit
a65f4ccb89
@ -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.
|
// Check if we have the right number of strips, offsets and counts.
|
||||||
rps := int(d.firstVal(tRowsPerStrip))
|
rps := int(d.firstVal(tRowsPerStrip))
|
||||||
|
if rps == 0 {
|
||||||
|
// Assume only one strip.
|
||||||
|
rps = d.config.Height
|
||||||
|
}
|
||||||
numStrips := (d.config.Height + rps - 1) / rps
|
numStrips := (d.config.Height + rps - 1) / rps
|
||||||
if rps == 0 || len(d.features[tStripOffsets]) < numStrips || len(d.features[tStripByteCounts]) < numStrips {
|
if rps == 0 || len(d.features[tStripOffsets]) < numStrips || len(d.features[tStripByteCounts]) < numStrips {
|
||||||
return nil, FormatError("inconsistent header")
|
return nil, FormatError("inconsistent header")
|
||||||
|
25
src/pkg/image/tiff/reader_test.go
Normal file
25
src/pkg/image/tiff/reader_test.go
Normal 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
BIN
src/pkg/image/tiff/testdata/no_rps.tiff
vendored
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user