golang/go

x/net/spdy: processing of 35 bytes takes 7 seconds

dvyukov opened this issue · 2 comments

The following program runs for 7+ seconds. This is too much to process 35 bytes of input.

package main

import (
    "bytes"
    "encoding/hex"
    "golang.org/x/net/spdy"
    "io/ioutil"
)

func main() {
    data, _ := hex.DecodeString("80300002303030303030303078f9e3c6a7c24230104e04e57c08af090600000000ffff")
    framer, err := spdy.NewFramer(ioutil.Discard, bytes.NewReader(data))
    if err != nil {
        panic(err)
    }
    for score := 0; ; score++ {
        f, err := framer.ReadFrame()
        if err != nil {
            if f != nil {
                panic(err)
            }
            return
        }
        err = framer.WriteFrame(f)
        if err != nil {
            panic(err)
        }
    }
}

on commit 6f62f426de90c0ed6a55207b51476115fcb17237

The profile looks like:

 90.12%  spdy  spdy               [.] runtime.heapBitsSetType
  6.76%  spdy  [kernel.kallsyms]  [k] clear_page_c
  1.85%  spdy  spdy               [.] runtime.memclr

The number of headers in SYN_REPLY frame is 740961381 !
As a result, it takes more than 7 seconds to create such a map with size 740961381.