From 50c5072ed825753d4b1e60066254bb6791fcea48 Mon Sep 17 00:00:00 2001 From: Sardorbek Pulatov Date: Tue, 5 Nov 2019 17:50:56 +0100 Subject: [PATCH] tiff/lzw: should return io.UnexpectedEOF on empty data bmp: should return io.UnexpectedEOF on empty data fixing: https://github.com/golang/go/issues/11391 --- bmp/reader.go | 6 ++++++ bmp/reader_test.go | 12 ++++++++++++ tiff/reader.go | 3 +++ tiff/reader_test.go | 11 +++++++++++ 4 files changed, 32 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..eb5f86b0 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,13 @@ 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([]byte{})) + + if err != io.ErrUnexpectedEOF { + t.Errorf("Error should be io.ErrUnexpectedEOF 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..037af6bf 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,16 @@ 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([]byte{})) + + if err != io.ErrUnexpectedEOF { + t.Errorf("Error should be io.ErrUnexpectedEOF 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) {