Closed
Description
The following program allocates 3GB+ while input data is 36 bytes and image size is small.
package main
import (
"golang.org/x/image/webp"
"strings"
)
func main() {
data := "RIFF0000WEBPVP8 00\xef\xbf\xbd\x01\x00\x14\x00\x00\xb24\n\x9d\x01*\x96\x00g\x00"
cfg, err := webp.DecodeConfig(strings.NewReader(data))
if err != nil {
return
}
if cfg.Width*cfg.Height > 1e6 {
return
}
if _, err := webp.Decode(strings.NewReader(data)); err != nil {
return
}
}
with ulimit -v 1000000 it crashes as:
fatal error: runtime: out of memory
goroutine 1 [running]:
runtime.systemstack_switch()
src/runtime/asm_amd64.s:216 fp=0xc20803f918 sp=0xc20803f910
runtime.mallocgc(0xbfef3020, 0x4ad900, 0x1, 0xd)
src/runtime/malloc.go:629 +0x925 fp=0xc20803f9e8 sp=0xc20803f918
runtime.newarray(0x4ad900, 0xbfef3020, 0x0)
src/runtime/malloc.go:745 +0xcc fp=0xc20803fa28 sp=0xc20803f9e8
runtime.makeslice(0x4a5340, 0xbfef3020, 0xbfef3020, 0x0, 0x0, 0x0)
src/runtime/slice.go:32 +0x168 fp=0xc20803fa78 sp=0xc20803fa28
golang.org/x/image/vp8.(*Decoder).parseOtherPartitions(0xc20806e000, 0x0, 0x0)
src/golang.org/x/image/vp8/decode.go:273 +0x5e fp=0xc20803fb70 sp=0xc20803fa78
golang.org/x/image/vp8.(*Decoder).parseOtherHeaders(0xc20806e000, 0x0, 0x0)
src/golang.org/x/image/vp8/decode.go:311 +0x1f0 fp=0xc20803fc28 sp=0xc20803fb70
golang.org/x/image/vp8.(*Decoder).DecodeFrame(0xc20806e000, 0xd08010600, 0x0, 0x0)
src/golang.org/x/image/vp8/decode.go:338 +0x4e fp=0xc20803fca8 sp=0xc20803fc28
golang.org/x/image/webp.decode(0x7f541f68b1c0, 0xc208016420, 0x401f00, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
src/golang.org/x/image/webp/decode.go:96 +0x8d5 fp=0xc20803fe58 sp=0xc20803fca8
golang.org/x/image/webp.Decode(0x7f541f68b1c0, 0xc208016420, 0x0, 0x0, 0x0, 0x0)
src/golang.org/x/image/webp/decode.go:259 +0x55 fp=0xc20803feb8 sp=0xc20803fe58
main.main()
webp.go:19 +0x233 fp=0xc20803ff90 sp=0xc20803feb8
The allocation request is for 0xbfef3020 (3220123680) bytes.
on commit c5f9292598396797bde21d35a38a3da25f561f81