diff options
Diffstat (limited to 'pkg/manager/http.go')
| -rw-r--r-- | pkg/manager/http.go | 66 |
1 files changed, 52 insertions, 14 deletions
diff --git a/pkg/manager/http.go b/pkg/manager/http.go index 61d208f41..881c8154d 100644 --- a/pkg/manager/http.go +++ b/pkg/manager/http.go @@ -539,7 +539,7 @@ func (serv *HTTPServer) httpCoverCover(w http.ResponseWriter, r *http.Request, f }() } - var progs []cover.Prog + var progs []coverProgRaw if sig := r.FormValue("input"); sig != "" { inp := corpus.Item(sig) if inp == nil { @@ -552,16 +552,16 @@ func (serv *HTTPServer) httpCoverCover(w http.ResponseWriter, r *http.Request, f http.Error(w, "bad call_id", http.StatusBadRequest) return } - progs = append(progs, cover.Prog{ - Sig: sig, - Data: string(inp.Prog.Serialize()), - PCs: CoverToPCs(serv.Cfg, inp.Updates[updateID].RawCover), + progs = append(progs, coverProgRaw{ + sig: sig, + prog: inp.Prog, + pcs: CoverToPCs(serv.Cfg, inp.Updates[updateID].RawCover), }) } else { - progs = append(progs, cover.Prog{ - Sig: sig, - Data: string(inp.Prog.Serialize()), - PCs: CoverToPCs(serv.Cfg, inp.Cover), + progs = append(progs, coverProgRaw{ + sig: sig, + prog: inp.Prog, + pcs: CoverToPCs(serv.Cfg, inp.Cover), }) } } else { @@ -570,10 +570,10 @@ func (serv *HTTPServer) httpCoverCover(w http.ResponseWriter, r *http.Request, f if call != "" && call != inp.StringCall() { continue } - progs = append(progs, cover.Prog{ - Sig: inp.Sig, - Data: string(inp.Prog.Serialize()), - PCs: CoverToPCs(serv.Cfg, inp.Cover), + progs = append(progs, coverProgRaw{ + sig: inp.Sig, + prog: inp.Prog, + pcs: CoverToPCs(serv.Cfg, inp.Cover), }) } } @@ -588,7 +588,7 @@ func (serv *HTTPServer) httpCoverCover(w http.ResponseWriter, r *http.Request, f } params := cover.HandlerParams{ - Progs: progs, + Progs: serv.serializeCoverProgs(progs), Filter: coverFilter, Debug: r.FormValue("debug") != "", Force: r.FormValue("force") != "", @@ -621,6 +621,44 @@ func (serv *HTTPServer) httpCoverCover(w http.ResponseWriter, r *http.Request, f } } +type coverProgRaw struct { + sig string + prog *prog.Prog + pcs []uint64 +} + +// Once the total size of corpus programs exceeds 100MB, skip fs images from it. +const compactProgsCutOff = 100 * 1000 * 1000 + +func (serv *HTTPServer) serializeCoverProgs(rawProgs []coverProgRaw) []cover.Prog { + skipImages := false +outerLoop: + for { + var flags []prog.SerializeFlag + if skipImages { + flags = append(flags, prog.SkipImages) + } + totalSize := 0 + var ret []cover.Prog + for _, item := range rawProgs { + prog := cover.Prog{ + Sig: item.sig, + Data: string(item.prog.Serialize(flags...)), + PCs: item.pcs, + } + totalSize += len(prog.Data) + if totalSize > compactProgsCutOff && !skipImages { + log.Logf(0, "total size of corpus programs is too big, "+ + "full fs image won't be included in the cover reports") + skipImages = true + continue outerLoop + } + ret = append(ret, prog) + } + return ret + } +} + func (serv *HTTPServer) httpCoverFallback(w http.ResponseWriter, r *http.Request) { corpus := serv.Corpus.Load() if corpus == nil { |
