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>
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 @@
 	"bytes"
 	"compress/zlib"
 	"encoding/binary"
+	"errors"
 	"image"
 	"io"
 	"sort"
@@ -338,6 +339,8 @@
 		}
 	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 @@
 	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)