git.lucas.co / go_mono
git clone https://git.lucas.co/go_mono.git

commitda761ea9ff43b0defcf66e8784f2aa4faa517dde
parente7c1f5e7db
authorSardorbek Pulatov <sardorbek.pulatov@outlook.com>
date2019-11-26 08:26
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 <aindurti@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Akhil Indurti <aindurti@gmail.com>
Reviewed-by: Nigel Tao <nigeltao@golang.org>

 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 c10a022..52e2520 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 e54aafd..8325f34 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 c26ec36..de73f4b 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 82134c4..f91fd94 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) {