aboutsummaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
Diffstat (limited to 'pkg')
-rw-r--r--pkg/manager/http.go66
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 {