From b8d2d6b9c0fcd66fe9579d7525d4ec5ecc2d73a3 Mon Sep 17 00:00:00 2001 From: Nigel Tao Date: Mon, 29 Jun 2015 16:43:25 +1000 Subject: [PATCH] image/gif: accept LZW encodings that do not have an explicit end marker. The spec says this is invalid, but it matches giflib's behavior. Fixes #9856 (together with https://go-review.googlesource.com/11661). Change-Id: I05701f62a9e5e724a2d85c6b87ae4111e537146b Reviewed-on: https://go-review.googlesource.com/11663 Reviewed-by: Rob Pike --- src/image/gif/reader.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/image/gif/reader.go b/src/image/gif/reader.go index cf5af210a6..a1da69780c 100644 --- a/src/image/gif/reader.go +++ b/src/image/gif/reader.go @@ -202,9 +202,18 @@ func (d *decoder) decode(r io.Reader, configOnly bool) error { } return errNotEnough } - // Both lzwr and br should be exhausted. Reading from them - // should yield (0, io.EOF). - if n, err := lzwr.Read(d.tmp[:1]); n != 0 || err != io.EOF { + // Both lzwr and br should be exhausted. Reading from them should + // yield (0, io.EOF). + // + // The spec (Appendix F - Compression), says that "An End of + // Information code... must be the last code output by the encoder + // for an image". In practice, though, giflib (a widely used C + // library) does not enforce this, so we also accept lzwr returning + // io.ErrUnexpectedEOF (meaning that the encoded stream hit io.EOF + // before the LZW decoder saw an explict end code), provided that + // the io.ReadFull call above successfully read len(m.Pix) bytes. + // See http://golang.org/issue/9856 for an example GIF. + if n, err := lzwr.Read(d.tmp[:1]); n != 0 || (err != io.EOF && err != io.ErrUnexpectedEOF) { if err != nil { return err }