aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTaras Madan <tarasmadan@google.com>2024-02-21 15:57:39 +0100
committerTaras Madan <tarasmadan@google.com>2024-02-26 13:40:58 +0000
commit34642b76bd94b7e7600efd0aaeba1c09f65926fe (patch)
treeb1ee129f8ff0ef0e23af48fa9ba37f32a0191e45
parentedd6a5e964598ffc78ee22374d8e0dd3326fb6a2 (diff)
html.go: refactor httpCoverCover
-rw-r--r--pkg/cover/html.go20
-rw-r--r--syz-manager/html.go50
2 files changed, 29 insertions, 41 deletions
diff --git a/pkg/cover/html.go b/pkg/cover/html.go
index 8cb9e7511..956a9bc24 100644
--- a/pkg/cover/html.go
+++ b/pkg/cover/html.go
@@ -13,7 +13,6 @@ import (
"html/template"
"io"
"math"
- "net/http"
"os"
"path/filepath"
"sort"
@@ -185,8 +184,8 @@ func fileLineContents(file *file, lines [][]byte) lineCoverExport {
return lce
}
-func (rg *ReportGenerator) DoRawCoverFiles(w http.ResponseWriter, progs []Prog, coverFilter map[uint32]uint32) error {
- progs = fixUpPCs(rg.target.Arch, progs, coverFilter)
+func (rg *ReportGenerator) DoRawCoverFiles(w io.Writer, params CoverHandlerParams) error {
+ progs := fixUpPCs(rg.target.Arch, params.Progs, params.CoverFilter)
if err := rg.lazySymbolize(progs); err != nil {
return err
}
@@ -201,7 +200,6 @@ func (rg *ReportGenerator) DoRawCoverFiles(w http.ResponseWriter, progs []Prog,
return fl.PC < fr.PC
})
- w.Header().Set("Content-Type", "text/plain; charset=utf-8")
buf := bufio.NewWriter(w)
fmt.Fprintf(buf, "PC,Module,Offset,Filename,Inline,StartLine,EndLine\n")
for _, frame := range resFrames {
@@ -213,8 +211,8 @@ func (rg *ReportGenerator) DoRawCoverFiles(w http.ResponseWriter, progs []Prog,
return nil
}
-func (rg *ReportGenerator) DoRawCover(w http.ResponseWriter, progs []Prog, coverFilter map[uint32]uint32) {
- progs = fixUpPCs(rg.target.Arch, progs, coverFilter)
+func (rg *ReportGenerator) DoRawCover(w io.Writer, params CoverHandlerParams) error {
+ progs := fixUpPCs(rg.target.Arch, params.Progs, params.CoverFilter)
var pcs []uint64
if len(progs) == 1 && rg.rawCoverEnabled {
pcs = append([]uint64{}, progs[0].PCs...)
@@ -234,16 +232,16 @@ func (rg *ReportGenerator) DoRawCover(w http.ResponseWriter, progs []Prog, cover
})
}
- w.Header().Set("Content-Type", "text/plain; charset=utf-8")
buf := bufio.NewWriter(w)
for _, pc := range pcs {
fmt.Fprintf(buf, "0x%x\n", pc)
}
buf.Flush()
+ return nil
}
-func (rg *ReportGenerator) DoFilterPCs(w http.ResponseWriter, progs []Prog, coverFilter map[uint32]uint32) {
- progs = fixUpPCs(rg.target.Arch, progs, coverFilter)
+func (rg *ReportGenerator) DoFilterPCs(w io.Writer, params CoverHandlerParams) error {
+ progs := fixUpPCs(rg.target.Arch, params.Progs, params.CoverFilter)
var pcs []uint64
uniquePCs := make(map[uint64]bool)
for _, prog := range progs {
@@ -252,7 +250,7 @@ func (rg *ReportGenerator) DoFilterPCs(w http.ResponseWriter, progs []Prog, cove
continue
}
uniquePCs[pc] = true
- if coverFilter[uint32(pc)] != 0 {
+ if params.CoverFilter[uint32(pc)] != 0 {
pcs = append(pcs, pc)
}
}
@@ -261,12 +259,12 @@ func (rg *ReportGenerator) DoFilterPCs(w http.ResponseWriter, progs []Prog, cove
return pcs[i] < pcs[j]
})
- w.Header().Set("Content-Type", "text/plain; charset=utf-8")
buf := bufio.NewWriter(w)
for _, pc := range pcs {
fmt.Fprintf(buf, "0x%x\n", pc)
}
buf.Flush()
+ return nil
}
type fileStats struct {
diff --git a/syz-manager/html.go b/syz-manager/html.go
index 11b21817d..04c23b459 100644
--- a/syz-manager/html.go
+++ b/syz-manager/html.go
@@ -335,42 +335,32 @@ func (mgr *Manager) httpCoverCover(w http.ResponseWriter, r *http.Request, funcF
coverFilter = mgr.coverFilter
}
- if funcFlag == DoRawCoverFiles {
- if err := rg.DoRawCoverFiles(w, progs, coverFilter); err != nil {
- http.Error(w, fmt.Sprintf("failed to generate coverage profile: %v", err), http.StatusInternalServerError)
- return
- }
- runtime.GC()
- return
- } else if funcFlag == DoRawCover {
- rg.DoRawCover(w, progs, coverFilter)
- return
- } else if funcFlag == DoFilterPCs {
- rg.DoFilterPCs(w, progs, coverFilter)
- return
+ params := cover.CoverHandlerParams{
+ Progs: progs,
+ CoverFilter: coverFilter,
+ Debug: r.FormValue("debug") != "",
}
- do := rg.DoHTML
-
- if funcFlag == DoHTMLTable {
- do = rg.DoHTMLTable
- } else if funcFlag == DoModuleCover {
- do = rg.DoModuleCover
- } else if funcFlag == DoCSV {
- do = rg.DoCSV
- } else if funcFlag == DoCSVFiles {
- do = rg.DoCSVFiles
+ type handlerFuncType func(w io.Writer, params cover.CoverHandlerParams) error
+ flagToFunc := map[int]struct {
+ Do handlerFuncType
+ isPlainText bool
+ }{
+ DoHTML: {rg.DoHTML, false},
+ DoHTMLTable: {rg.DoHTMLTable, false},
+ DoModuleCover: {rg.DoModuleCover, false},
+ DoCSV: {rg.DoCSV, false},
+ DoCSVFiles: {rg.DoCSVFiles, true},
+ DoRawCoverFiles: {rg.DoRawCoverFiles, true},
+ DoRawCover: {rg.DoRawCover, true},
+ DoFilterPCs: {rg.DoFilterPCs, true},
}
- debug := r.FormValue("debug") != ""
-
- params := cover.CoverHandlerParams{
- Progs: progs,
- CoverFilter: coverFilter,
- Debug: debug,
+ if flagToFunc[funcFlag].isPlainText {
+ w.Header().Set("Content-Type", "text/plain; charset=utf-8")
}
- if err := do(w, params); err != nil {
+ if err := flagToFunc[funcFlag].Do(w, params); err != nil {
http.Error(w, fmt.Sprintf("failed to generate coverage profile: %v", err), http.StatusInternalServerError)
return
}