From cdf1aa4dc338ddd37917942e7d6b992f4e079a00 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Sat, 6 Jun 2020 09:15:20 +0200 Subject: pkg/report: deduplicate code across netbsd and openbsd --- pkg/report/openbsd.go | 122 +++----------------------------------------------- 1 file changed, 5 insertions(+), 117 deletions(-) (limited to 'pkg/report/openbsd.go') diff --git a/pkg/report/openbsd.go b/pkg/report/openbsd.go index 8d29dba10..9373b607b 100644 --- a/pkg/report/openbsd.go +++ b/pkg/report/openbsd.go @@ -4,47 +4,19 @@ package report import ( - "bufio" - "bytes" - "fmt" - "path/filepath" "regexp" - "strconv" - "strings" - - "github.com/google/syzkaller/pkg/symbolizer" ) -type openbsd struct { - *config - kernelObject string - symbols map[string][]symbolizer.Symbol -} - -var ( - openbsdSymbolizeRe = []*regexp.Regexp{ +func ctorOpenbsd(cfg *config) (Reporter, []string, error) { + symbolizeRes := []*regexp.Regexp{ // stack regexp.MustCompile(` at ([A-Za-z0-9_]+)\+0x([0-9a-f]+)`), // witness regexp.MustCompile(`#[0-9]+ +([A-Za-z0-9_]+)\+0x([0-9a-f]+)`), } -) - -func ctorOpenbsd(cfg *config) (Reporter, []string, error) { - var symbols map[string][]symbolizer.Symbol - kernelObject := "" - if cfg.kernelObj != "" { - kernelObject = filepath.Join(cfg.kernelObj, cfg.target.KernelObject) - var err error - symbols, err = symbolizer.ReadTextSymbols(kernelObject) - if err != nil { - return nil, nil, err - } - } - ctx := &openbsd{ - config: cfg, - kernelObject: kernelObject, - symbols: symbols, + ctx, err := ctorBSD(cfg, openbsdOopses, symbolizeRes) + if err != nil { + return nil, nil, err } suppressions := []string{ "panic: fifo_badop called", @@ -52,90 +24,6 @@ func ctorOpenbsd(cfg *config) (Reporter, []string, error) { return ctx, suppressions, nil } -func (ctx *openbsd) ContainsCrash(output []byte) bool { - return containsCrash(output, openbsdOopses, ctx.ignores) -} - -func (ctx *openbsd) Parse(output []byte) *Report { - stripped := bytes.Replace(output, []byte{'\r', '\n'}, []byte{'\n'}, -1) - stripped = bytes.Replace(stripped, []byte{'\n', '\r'}, []byte{'\n'}, -1) - for len(stripped) != 0 && stripped[0] == '\r' { - stripped = stripped[1:] - } - rep := simpleLineParser(stripped, openbsdOopses, nil, ctx.ignores) - if rep == nil { - return nil - } - rep.Output = output - return rep -} - -func (ctx *openbsd) Symbolize(rep *Report) error { - symb := symbolizer.NewSymbolizer() - defer symb.Close() - var symbolized []byte - s := bufio.NewScanner(bytes.NewReader(rep.Report)) - prefix := rep.reportPrefixLen - for s.Scan() { - line := append([]byte{}, s.Bytes()...) - line = append(line, '\n') - newLine := ctx.symbolizeLine(symb.Symbolize, line) - if prefix > len(symbolized) { - prefix += len(newLine) - len(line) - } - symbolized = append(symbolized, newLine...) - } - rep.Report = symbolized - rep.reportPrefixLen = prefix - return nil -} - -func (ctx *openbsd) symbolizeLine(symbFunc func(bin string, pc uint64) ([]symbolizer.Frame, error), - line []byte) []byte { - var match []int - for _, re := range openbsdSymbolizeRe { - match = re.FindSubmatchIndex(line) - if match != nil { - break - } - } - if match == nil { - return line - } - fn := line[match[2]:match[3]] - off, err := strconv.ParseUint(string(line[match[4]:match[5]]), 16, 64) - if err != nil { - return line - } - - symb := ctx.symbols[string(fn)] - if len(symb) == 0 { - return line - } - fnStart := (0xffffffff << 32) | symb[0].Addr - - frames, err := symbFunc(ctx.kernelObject, fnStart+off) - if err != nil || len(frames) == 0 { - return line - } - var symbolized []byte - for _, frame := range frames { - file := frame.File - file = strings.TrimPrefix(file, ctx.kernelBuildSrc) - file = strings.TrimPrefix(file, "/") - info := fmt.Sprintf(" %v:%v", file, frame.Line) - modified := append([]byte{}, line...) - modified = replace(modified, match[5], match[5], []byte(info)) - if frame.Inline { - end := match[5] + len(info) - modified = replace(modified, end, end, []byte(" [inline]")) - modified = replace(modified, match[5], match[5], []byte(" "+frame.Func)) - } - symbolized = append(symbolized, modified...) - } - return symbolized -} - var openbsdOopses = append([]*oops{ { []byte("cleaned vnode"), -- cgit mrf-deployment