1
0
mirror of https://github.com/golang/go synced 2024-10-01 03:28:32 -06:00

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 <r@golang.org>
This commit is contained in:
Nigel Tao 2015-06-29 16:43:25 +10:00
parent fea18f5a34
commit b8d2d6b9c0

View File

@ -202,9 +202,18 @@ func (d *decoder) decode(r io.Reader, configOnly bool) error {
} }
return errNotEnough return errNotEnough
} }
// Both lzwr and br should be exhausted. Reading from them // Both lzwr and br should be exhausted. Reading from them should
// should yield (0, io.EOF). // yield (0, io.EOF).
if n, err := lzwr.Read(d.tmp[:1]); n != 0 || err != 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 { if err != nil {
return err return err
} }