diff --git a/syz-manager/html.go b/syz-manager/html.go
index 076d249b..789c416d 100644
--- a/syz-manager/html.go
+++ b/syz-manager/html.go
@@ -42,6 +42,7 @@ func (mgr *Manager) initHTTP() {
http.HandleFunc("/file", mgr.httpFile)
http.HandleFunc("/report", mgr.httpReport)
http.HandleFunc("/rawcover", mgr.httpRawCover)
+ http.HandleFunc("/funccover", mgr.httpFuncCover)
http.HandleFunc("/input", mgr.httpInput)
// Browsers like to request this, without special handler this goes to / handler.
http.HandleFunc("/favicon.ico", func(w http.ResponseWriter, r *http.Request) {})
@@ -210,10 +211,10 @@ func (mgr *Manager) httpCover(w http.ResponseWriter, r *http.Request) {
}
mgr.mu.Lock()
defer mgr.mu.Unlock()
- mgr.httpCoverCover(w, r)
+ mgr.httpCoverCover(w, r, reportGenerator.DoHTML)
}
-func (mgr *Manager) httpCoverCover(w http.ResponseWriter, r *http.Request) {
+func (mgr *Manager) httpCoverCover(w http.ResponseWriter, r *http.Request, do func(io.Writer, []cover.Prog) error) {
var progs []cover.Prog
if sig := r.FormValue("input"); sig != "" {
inp := mgr.corpus[sig]
@@ -233,7 +234,7 @@ func (mgr *Manager) httpCoverCover(w http.ResponseWriter, r *http.Request) {
})
}
}
- if err := reportGenerator.DoHTML(w, progs); err != nil {
+ if err := do(w, progs); err != nil {
http.Error(w, fmt.Sprintf("failed to generate coverage profile: %v", err), http.StatusInternalServerError)
return
}
@@ -271,6 +272,20 @@ func (mgr *Manager) httpCoverFallback(w http.ResponseWriter, r *http.Request) {
executeTemplate(w, fallbackCoverTemplate, data)
}
+func (mgr *Manager) httpFuncCover(w http.ResponseWriter, r *http.Request) {
+ if !mgr.cfg.Cover {
+ http.Error(w, "coverage is not enabled", http.StatusInternalServerError)
+ return
+ }
+ if err := initCover(mgr.sysTarget, mgr.cfg.KernelObj, mgr.cfg.KernelSrc, mgr.cfg.KernelBuildSrc); 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)
+}
+
func (mgr *Manager) httpPrio(w http.ResponseWriter, r *http.Request) {
mgr.mu.Lock()
defer mgr.mu.Unlock()