From a65f4ccb8994c1e6cfd8031012957a85e943b9b1 Mon Sep 17 00:00:00 2001 From: Benny Siegert Date: Thu, 28 Jul 2011 11:15:59 +1000 Subject: [PATCH] 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 --- src/pkg/image/tiff/reader.go | 4 ++++ src/pkg/image/tiff/reader_test.go | 25 ++++++++++++++++++++++++ src/pkg/image/tiff/testdata/no_rps.tiff | Bin 0 -> 1294 bytes 3 files changed, 29 insertions(+) create mode 100644 src/pkg/image/tiff/reader_test.go create mode 100644 src/pkg/image/tiff/testdata/no_rps.tiff diff --git a/src/pkg/image/tiff/reader.go b/src/pkg/image/tiff/reader.go index 26e52144d4..f5652667aa 100644 --- a/src/pkg/image/tiff/reader.go +++ b/src/pkg/image/tiff/reader.go @@ -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 index 0000000000..f2122c4403 --- /dev/null +++ b/src/pkg/image/tiff/reader_test.go @@ -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 index 0000000000000000000000000000000000000000..3280cf8e344b0ff0b6b98a1c3ca0029174eb82ef GIT binary patch literal 1294 zcmaKsYe23m2K>#59w9=WNVNi!@?5LL`+gI?HX&WjQwIQoCs%#Eqn) z%r0I^XGkXWA@Z`8Wu;J5Bz9FZsSjl&WFPt<1W(Ud8@yYWGoGFQd!GOAInOz~yed^9 zdBhL`06t;2+X;@+yzEUAdYxt=KR@q_G%@yLswDoCLZMjW@8>={9NmnBO=`bnv%qj) z3#I@X8trhraxa)mazU%rDY$;G*6a18ut-f-M~eEKLqpJV?kpTLs$tmWgwc^ZaR2&g z80$L)nVUA&mXv6STCMi!na}5CMT)|&)tQRn`@%PP{Nx#IOih8U>Fc4l`7pe3wZr=d z4k#&5P6?Ms@G~n@3g^7XDhsLw!z?) z2FOTHGwv=d^x^To0x?p`)j3~hA9lgS;05%z!hoX*p5AP6Yg%La-W9O!-vc3G0-N{j zboP!2VOaCCTjyb7s1?QsF2XCiFY1xr(=dp&C~vDSrGU>pdU>1$x*gfG)Au^vyt~Hj zHfV3Efit!v@Y>Y|9VeehRv(xFYyL+ZQjpx|Yc>j6iJD}&xAlm71yBEDmTOm zDe5Q=o50ah+$#fXyhKl)XPx%rKbDf;KZD7tB9)SQh$59OX! zMvXzAqcN204v6KfjFpO$4O>o~80ch876bVO`Vu8* literal 0 HcmV?d00001 -- 2.50.0