Skip to content

x/image/webp: excessive memory consumption #10790

Closed
@dvyukov

Description

@dvyukov

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions