aboutsummaryrefslogtreecommitdiffstats
path: root/syz-manager/html.go
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2020-12-11 18:18:58 +0100
committerDmitry Vyukov <dvyukov@google.com>2020-12-13 18:56:36 +0100
commit3fc0a844bfb8efd6f8fe32585e4fd5d9f2af3fc3 (patch)
tree9a6f4e9737e4312bb32ec9ea820cfa508e5add80 /syz-manager/html.go
parent138959733bc731cc789fa7c7473e493b2e104bcc (diff)
syz-manager: better encapsulate report generator
Avoid global variables and implicit dependencies on previous initialization.
Diffstat (limited to 'syz-manager/html.go')
-rw-r--r--syz-manager/html.go24
1 files changed, 14 insertions, 10 deletions
diff --git a/syz-manager/html.go b/syz-manager/html.go
index 24126adb5..0b606f099 100644
--- a/syz-manager/html.go
+++ b/syz-manager/html.go
@@ -214,22 +214,24 @@ func (mgr *Manager) httpCover(w http.ResponseWriter, r *http.Request) {
}
// Note: initCover is executed without mgr.mu because it takes very long time
// (but it only reads config and it protected by initCoverOnce).
- if err := initCover(mgr.cfg); err != nil {
+ rg, err := getReportGenerator(mgr.cfg)
+ if err != nil {
http.Error(w, fmt.Sprintf("failed to generate coverage profile: %v", err), http.StatusInternalServerError)
return
}
mgr.mu.Lock()
defer mgr.mu.Unlock()
- mgr.httpCoverCover(w, r, reportGenerator.DoHTML)
+ mgr.httpCoverCover(w, r, rg, rg.DoHTML)
}
-func (mgr *Manager) httpCoverCover(w http.ResponseWriter, r *http.Request, do func(io.Writer, []cover.Prog) error) {
+func (mgr *Manager) httpCoverCover(w http.ResponseWriter, r *http.Request,
+ rg *cover.ReportGenerator, do func(io.Writer, []cover.Prog) error) {
var progs []cover.Prog
if sig := r.FormValue("input"); sig != "" {
inp := mgr.corpus[sig]
progs = append(progs, cover.Prog{
Data: string(inp.Prog),
- PCs: coverToPCs(mgr.sysTarget, inp.Cover),
+ PCs: coverToPCs(rg, inp.Cover),
})
} else {
call := r.FormValue("call")
@@ -239,7 +241,7 @@ func (mgr *Manager) httpCoverCover(w http.ResponseWriter, r *http.Request, do fu
}
progs = append(progs, cover.Prog{
Data: string(inp.Prog),
- PCs: coverToPCs(mgr.sysTarget, inp.Cover),
+ PCs: coverToPCs(rg, inp.Cover),
})
}
}
@@ -286,13 +288,14 @@ func (mgr *Manager) httpFuncCover(w http.ResponseWriter, r *http.Request) {
http.Error(w, "coverage is not enabled", http.StatusInternalServerError)
return
}
- if err := initCover(mgr.cfg); err != nil {
+ rg, err := getReportGenerator(mgr.cfg)
+ if err != nil {
http.Error(w, fmt.Sprintf("failed to generate coverage profile: %v", err), http.StatusInternalServerError)
return
}
mgr.mu.Lock()
defer mgr.mu.Unlock()
- mgr.httpCoverCover(w, r, reportGenerator.DoCSV)
+ mgr.httpCoverCover(w, r, rg, rg.DoCSV)
}
func (mgr *Manager) httpPrio(w http.ResponseWriter, r *http.Request) {
@@ -392,8 +395,9 @@ func (mgr *Manager) httpReport(w http.ResponseWriter, r *http.Request) {
func (mgr *Manager) httpRawCover(w http.ResponseWriter, r *http.Request) {
// Note: initCover is executed without mgr.mu because it takes very long time
// (but it only reads config and it protected by initCoverOnce).
- if err := initCover(mgr.cfg); err != nil {
- http.Error(w, initCoverError.Error(), http.StatusInternalServerError)
+ rg, err := getReportGenerator(mgr.cfg)
+ if err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
mgr.mu.Lock()
@@ -403,7 +407,7 @@ func (mgr *Manager) httpRawCover(w http.ResponseWriter, r *http.Request) {
for _, inp := range mgr.corpus {
cov.Merge(inp.Cover)
}
- pcs := coverToPCs(mgr.sysTarget, cov.Serialize())
+ pcs := coverToPCs(rg, cov.Serialize())
sort.Slice(pcs, func(i, j int) bool {
return pcs[i] < pcs[j]
})