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) {