From da761ea9ff43b0defcf66e8784f2aa4faa517dde Mon Sep 17 00:00:00 2001 From: Sardorbek Pulatov Date: Tue, 26 Nov 2019 08:26:16 +0000 Subject: [PATCH] tiff, bmp: return io.UnexpectedEOF on empty data Check for an EOF when decoding the tiff and bmp headers, so that decoding empty data does not return an EOF. Fixes golang/go#11391 Change-Id: I73394b9dcc0d2e4e2a7bc56addb3f690791820ba GitHub-Last-Rev: 924636fca185e34399b558c92c1d4b80f43eadfc GitHub-Pull-Request: golang/image#3 Reviewed-on: https://go-review.googlesource.com/c/image/+/205458 Run-TryBot: Akhil Indurti TryBot-Result: Gobot Gobot Reviewed-by: Akhil Indurti Reviewed-by: Nigel Tao --- bmp/reader.go | 6 ++++++ bmp/reader_test.go | 11 +++++++++++ tiff/reader.go | 3 +++ tiff/reader_test.go | 10 ++++++++++ 4 files changed, 30 insertions(+) diff --git a/bmp/reader.go b/bmp/reader.go index c10a022f..52e25205 100644 --- a/bmp/reader.go +++ b/bmp/reader.go @@ -144,6 +144,9 @@ func decodeConfig(r io.Reader) (config image.Config, bitsPerPixel int, topDown b ) var b [1024]byte if _, err := io.ReadFull(r, b[:fileHeaderLen+4]); err != nil { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } return image.Config{}, 0, false, err } if string(b[:2]) != "BM" { @@ -155,6 +158,9 @@ func decodeConfig(r io.Reader) (config image.Config, bitsPerPixel int, topDown b return image.Config{}, 0, false, ErrUnsupported } if _, err := io.ReadFull(r, b[fileHeaderLen+4:fileHeaderLen+infoLen]); err != nil { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } return image.Config{}, 0, false, err } width := int(int32(readUint32(b[18:22]))) diff --git a/bmp/reader_test.go b/bmp/reader_test.go index e54aafd3..8325f342 100644 --- a/bmp/reader_test.go +++ b/bmp/reader_test.go @@ -5,8 +5,10 @@ package bmp import ( + "bytes" "fmt" "image" + "io" "os" "testing" @@ -75,3 +77,12 @@ func TestDecode(t *testing.T) { } } } + +// TestEOF tests that decoding a BMP image returns io.ErrUnexpectedEOF +// when there are no headers or data is empty +func TestEOF(t *testing.T) { + _, err := Decode(bytes.NewReader(nil)) + if err != io.ErrUnexpectedEOF { + t.Errorf("Error should be io.ErrUnexpectedEOF on nil but got %v", err) + } +} diff --git a/tiff/reader.go b/tiff/reader.go index c26ec36b..de73f4b9 100644 --- a/tiff/reader.go +++ b/tiff/reader.go @@ -404,6 +404,9 @@ func newDecoder(r io.Reader) (*decoder, error) { p := make([]byte, 8) if _, err := d.r.ReadAt(p, 0); err != nil { + if err == io.EOF { + err = io.ErrUnexpectedEOF + } return nil, err } switch string(p[0:4]) { diff --git a/tiff/reader_test.go b/tiff/reader_test.go index 82134c4c..f91fd94f 100644 --- a/tiff/reader_test.go +++ b/tiff/reader_test.go @@ -10,6 +10,7 @@ import ( "encoding/hex" "errors" "image" + "io" "io/ioutil" "os" "strings" @@ -193,6 +194,15 @@ func TestDecodeLZW(t *testing.T) { compare(t, img0, img1) } +// TestEOF tests that decoding a TIFF image returns io.ErrUnexpectedEOF +// when there are no headers or data is empty +func TestEOF(t *testing.T) { + _, err := Decode(bytes.NewReader(nil)) + if err != io.ErrUnexpectedEOF { + t.Errorf("Error should be io.ErrUnexpectedEOF on nil but got %v", err) + } +} + // TestDecodeCCITT tests that decoding a PNG image and a CCITT compressed TIFF // image result in the same pixel data. func TestDecodeCCITT(t *testing.T) {