What version of Go are you using (go version)?
$ go version
go version go1.14.1 linux/amd64
Does this issue reproduce with the latest release?
Yes (and it has probably existed for a very long time, possibly forever)
What operating system and processor architecture are you using (go env)?
go env Output
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/steve/.cache/go-build"
GOENV="/home/steve/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOOS="linux"
GOPATH="/home/steve/go"
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build601247294=/tmp/go-build -gno-record-gcc-switches"
GOROOT/bin/go version: go version go1.14.1 linux/amd64
GOROOT/bin/go tool compile -V: compile version go1.14.1
uname -sr: Linux 5.3.0-46-generic
Distributor ID: Ubuntu
Description: Ubuntu 19.10
Release: 19.10
Codename: eoan
/lib/x86_64-linux-gnu/libc.so.6: GNU C Library (Ubuntu GLIBC 2.30-0ubuntu2.1) stable release version 2.30.
gdb --version: GNU gdb (Ubuntu 8.3-0ubuntu1) 8.3
What did you do?
Tried to use image/gif DecodeAll() on a GIF with extra 0x00 byte(s) before the trailer byte 0x3b.
Example:
https://play.golang.org/p/vzVJUj4TRgm
What did you expect to see?
The image loads properly (as it does in browsers, ImageMagick, gifsicle and Eye Of GNOME).
What did you see instead?
gif: unknown block type: 0x00
Comments
This is caused by a more strict implementation of the GIF file format than most other programs. We already address this issue for extraneous trailing bytes in the LZW decoder (#16146), but I am also seeing them elsewhere between blocks in real files, generally before the closing trailer byte.
Here are the hex dumps of some example files that I have found:
./test/gifs/PIL-V_AN.GIF
00000130 a8 e7 5c 3e 1f 8d d7 f1 9d e7 3b d8 c3 05 00 c4 |..\>......;.....|
00000140 60 2f 56 34 d2 2a 49 a5 e9 d1 74 c2 86 51 65 aa |`/V4.*I...t..Qe.|
00000150 4a cc 6a 27 d9 a7 68 d4 fc 5e 21 53 31 35 50 36 |J.j'..h..^!S15P6|
00000160 03 be 05 00 00 3b |.....;|
00000166
./test/gifs/CDROM.GIF
00004190 2e 00 f0 8f a2 b9 10 5c 65 5b 06 e0 55 1b c0 7c |.......\e[..U..||
000041a0 5f 85 02 2e e7 6a b3 89 8a cc c6 4a bf 39 9c c4 |_....j.....J.9..|
000041b0 59 9c 0c c6 79 9c c8 99 9c ca b9 9c c6 19 10 00 |Y...y...........|
000041c0 00 3b |.;|
000041c2
./test/gifs/LYSSKILT.GIF
00001c20 b1 a8 8f ac ac ca 69 b0 cc 79 c7 74 d3 ad 8f da |......i..y.t....|
00001c30 d1 96 b6 cd dd 9d d7 f0 f1 f2 f3 f4 f5 f6 f7 f8 |................|
00001c40 f9 fa fb fc fd fe ff 00 03 0a 1c 48 b0 47 04 00 |...........H.G..|
00001c50 00 3b |.;|
00001c52
./test/gifs/PIL-N_AN.GIF
00000140 12 dd 50 31 2a 1e 2b 38 e5 92 e7 14 f2 0c d1 1b |..P1*.+8........|
00000150 a9 64 14 01 73 ba 29 97 b3 bd 46 af b1 09 99 04 |.d..s.)...F.....|
00000160 38 ab d7 ec b6 fb 0d 8f cb e7 f4 ba fd 8e cf eb |8...............|
00000170 c9 05 00 00 3b |....;|
00000175
./test/gifs/PIL-O_AN.GIF
00000130 c4 f2 3c d9 b7 08 f4 be 2e f1 35 7a 37 1a 0a 98 |..<.......5z7...|
00000140 19 22 35 44 99 51 59 4c c2 96 15 ea 31 ca b4 42 |."5D.QYL....1..B|
00000150 77 d9 9f f7 03 0e 8b c7 e4 b2 f9 8c 4e ab d7 ec |w...........N...|
00000160 b6 fb 0d 67 17 00 00 00 3b |...g....;|
00000169
./test/gifs/LYS.GIF
000026b0 e8 c5 d0 5e 05 15 24 80 60 05 fe b9 77 1c 72 04 |...^..$.`...w.r.|
000026c0 2e a0 c2 09 09 d2 04 d7 85 0c 76 f0 20 6f 01 44 |..........v. o.D|
000026d0 b0 c0 03 09 0e 90 d8 00 02 50 55 80 03 28 3e 88 |.........PU..(>.|
000026e0 5c 40 00 00 3b |\@..;|
000026e5
./test/gifs/MOOSE.GIF
000048d0 20 63 72 65 61 74 65 64 20 77 69 74 68 20 61 20 | created with a |
000048e0 72 65 67 69 73 74 65 72 65 64 20 76 65 72 73 69 |registered versi|
000048f0 6f 6e 20 6f 66 20 47 49 46 20 43 6f 6e 73 74 72 |on of GIF Constr|
00004900 75 63 74 69 6f 6e 20 53 65 74 00 00 |uction Set..|
0000490c
./test/gifs/SOUNDER2.GIF
00000210 9b c5 57 57 3e 31 16 63 90 a5 b8 95 5e 98 36 2b |..WW>1.c....^.6+|
00000220 fa a9 d1 db b9 18 fd 50 09 9c 9d b9 df a3 01 67 |.......P.......g|
00000230 43 56 0c 37 32 25 8f 8a a6 c2 e4 74 16 00 00 00 |CV.72%.....t....|
00000240 3b |;|
00000241
./test/gifs/PIL-H_AN.GIF
00000140 f1 68 a9 60 70 78 2a 1a 81 c8 90 72 19 6b 66 9e |.h.`px*....r.kf.|
00000150 50 18 f1 57 8d f5 a8 d9 5e 0d 9b b5 78 bf 61 d7 |P..W....^...x.a.|
00000160 f8 bb 49 ab 9f 67 89 b2 ed c6 c2 e3 e2 79 64 64 |..I..g.......ydd|
00000170 77 4b 0a 00 00 3b |wK...;|
00000176
./test/gifs/COFFEEMA.GIF
00004a30 ea 05 4e b5 44 b6 71 06 67 f2 10 31 da ae e3 4a |..N.D.q.g..1...J|
00004a40 21 c3 73 61 fc 85 15 7b 21 a5 f6 3a 0c 6e 18 a5 |!.sa...{!..:.n..|
00004a50 40 79 a8 ff 4a 0b 44 27 a5 46 70 05 f5 5a b0 0c |@y..J.D'.Fp..Z..|
00004a60 db b0 b2 12 02 00 00 3b |.......;|
00004a68
Here are the images referenced above, they are all very small:
https://drive.google.com/drive/folders/13hKuVy_Kf2MeyWacXLPanwhH2uoIxLUe?usp=sharing
I have a simple solution so I'll put in a PR, but I'm not sure how strict you want to be in handling this (is one extraneous byte OK, but two not OK, for example?).
What version of Go are you using (
go version)?Does this issue reproduce with the latest release?
Yes (and it has probably existed for a very long time, possibly forever)
What operating system and processor architecture are you using (
go env)?go envOutputWhat did you do?
Tried to use
image/gifDecodeAll()on a GIF with extra0x00byte(s) before the trailer byte0x3b.Example:
https://play.golang.org/p/vzVJUj4TRgm
What did you expect to see?
The image loads properly (as it does in browsers, ImageMagick, gifsicle and Eye Of GNOME).
What did you see instead?
gif: unknown block type: 0x00Comments
This is caused by a more strict implementation of the GIF file format than most other programs. We already address this issue for extraneous trailing bytes in the LZW decoder (#16146), but I am also seeing them elsewhere between blocks in real files, generally before the closing trailer byte.
Here are the hex dumps of some example files that I have found:
Here are the images referenced above, they are all very small:
https://drive.google.com/drive/folders/13hKuVy_Kf2MeyWacXLPanwhH2uoIxLUe?usp=sharing
I have a simple solution so I'll put in a PR, but I'm not sure how strict you want to be in handling this (is one extraneous byte OK, but two not OK, for example?).