// Copyright 2018 syzkaller project authors. All rights reserved. // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. package report import ( "fmt" "testing" "github.com/google/syzkaller/pkg/symbolizer" ) func TestOpenbsdSymbolizeLine(t *testing.T) { tests := []struct { line string result string }{ // Normal symbolization. { "closef(ffffffff,ffffffff) at closef+0xaf\n", "closef(ffffffff,ffffffff) at closef+0xaf kern_descrip.c:1241\n", }, // Inlined frames. { "sleep_finish_all(ffffffff,32) at sleep_finish_all+0x22\n", "sleep_finish_all(ffffffff,32) at sleep_finish_all+0x22 sleep_finish_timeout kern_synch.c:336 [inline]\n" + "sleep_finish_all(ffffffff,32) at sleep_finish_all+0x22 kern_synch.c:157\n", }, // Missing symbol. { "foo(ffffffff,ffffffff) at foo+0x1e", "foo(ffffffff,ffffffff) at foo+0x1e", }, // Witness symbolization. { "#4 closef+0xaf\n", "#4 closef+0xaf kern_descrip.c:1241\n", }, { "#10 closef+0xaf\n", "#10 closef+0xaf kern_descrip.c:1241\n", }, } symbols := map[string][]symbolizer.Symbol{ "closef": { {Addr: 0x815088a0, Size: 0x12f}, }, "sleep_finish_all": { {Addr: 0x81237520, Size: 0x173}, }, } symb := func(bin string, pc uint64) ([]symbolizer.Frame, error) { if bin != "bsd.gdb" { return nil, fmt.Errorf("unknown pc 0x%x", pc) } switch pc & 0xffffffff { case 0x8150894f: return []symbolizer.Frame{ { File: "/usr/src/kern_descrip.c", Line: 1241, Func: "closef", }, }, nil case 0x81237542: return []symbolizer.Frame{ { Func: "sleep_finish_timeout", File: "/usr/src/kern_synch.c", Line: 336, Inline: true, }, { Func: "sleep_finish_all", File: "/usr/src/kern_synch.c", Line: 157, }, }, nil default: return nil, fmt.Errorf("unknown pc 0x%x", pc) } } obsd := openbsd{ kernelSrc: "/usr/src", kernelObj: "/usr/src/sys/arch/amd64/compile/SYZKALLER/obj", kernelObject: "bsd.gdb", symbols: symbols, } for i, test := range tests { t.Run(fmt.Sprint(i), func(t *testing.T) { result := obsd.symbolizeLine(symb, []byte(test.line)) if test.result != string(result) { t.Errorf("want %q\n\t get %q", test.result, string(result)) } }) } }