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

commita8550c1d254a56cf1762a2993881d2b23c0c83dd
parent723b81ca98
authorBenny Siegert <bsiegert@google.com>
date2022-03-18 17:49
tiff: do not crash when encoding with unsupported compression

tiff.Encode only supports uncompressed and deflate compression. When called
with a different compression type, it crashes with a nil pointer dereference.
Return a proper error instead.

Fixes golang/go#43137

Change-Id: I5dd9210ff0ae11b7e4f641375f26c6afc1515b98
Reviewed-on: https://go-review.googlesource.com/c/image/+/380334
Trust: Benny Siegert <bsiegert@gmail.com>
Run-TryBot: Benny Siegert <bsiegert@gmail.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Nigel Tao <nigeltao@golang.org>

 tiff/writer.go      | 3 +++
 tiff/writer_test.go | 9 +++++++++
 2 files changed, 12 insertions(+)

diff --git a/tiff/writer.go b/tiff/writer.go
index c8a01ce..4272c5a 100644
--- a/tiff/writer.go
+++ b/tiff/writer.go
@@ -8,6 +8,7 @@ import (
 	"bytes"
 	"compress/zlib"
 	"encoding/binary"
+	"errors"
 	"image"
 	"io"
 	"sort"
@@ -338,6 +339,8 @@ func Encode(w io.Writer, m image.Image, opt *Options) error {
 		}
 	case cDeflate:
 		dst = zlib.NewWriter(&buf)
+	default:
+		return errors.New("tiff: unsupported compression")
 	}
 
 	pr := uint32(prNone)
diff --git a/tiff/writer_test.go b/tiff/writer_test.go
index 0650df3..8f009e9 100644
--- a/tiff/writer_test.go
+++ b/tiff/writer_test.go
@@ -75,6 +75,15 @@ func TestRoundtrip2(t *testing.T) {
 	compare(t, m0, m1)
 }
 
+func TestUnsupported(t *testing.T) {
+	img := image.NewGray(image.Rect(0, 0, 1, 1))
+	out := new(bytes.Buffer)
+	err := Encode(out, img, &Options{Compression: LZW})
+	if err == nil {
+		t.Error("tiff.Encode(LZW): no error returned, expected an error")
+	}
+}
+
 func benchmarkEncode(b *testing.B, name string, pixelSize int) {
 	b.Helper()
 	img, err := openImage(name)