From 34642b76bd94b7e7600efd0aaeba1c09f65926fe Mon Sep 17 00:00:00 2001 From: Taras Madan Date: Wed, 21 Feb 2024 15:57:39 +0100 Subject: html.go: refactor httpCoverCover --- pkg/cover/html.go | 20 +++++++++----------- syz-manager/html.go | 50 ++++++++++++++++++++------------------------------ 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 } -- cgit mrf-deployment