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>
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 @@
 	)
 	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 @@
 		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 @@
 		}
 	}
 }
+
+// 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 @@
 
 	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 @@
 	"encoding/hex"
 	"errors"
 	"image"
+	"io"
 	"io/ioutil"
 	"os"
 	"strings"
@@ -193,6 +194,15 @@
 	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) {