47 lines
1.2 KiB
Go
47 lines
1.2 KiB
Go
// Copyright 2022 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package traces
|
|
|
|
import (
|
|
"golang.org/x/vuln/internal/govulncheck"
|
|
)
|
|
|
|
// Compact returns a summarization of finding.Trace. The first
|
|
// returned element is the vulnerable symbol and the last element
|
|
// is the exit point of the user module. There can also be two
|
|
// elements in between, if applicable, which are the two elements
|
|
// preceding the user module exit point.
|
|
func Compact(finding *govulncheck.Finding) []*govulncheck.Frame {
|
|
if len(finding.Trace) < 1 {
|
|
return nil
|
|
}
|
|
iTop := len(finding.Trace) - 1
|
|
topModule := finding.Trace[iTop].Module
|
|
// search for the exit point of the top module
|
|
for i, frame := range finding.Trace {
|
|
if frame.Module == topModule {
|
|
iTop = i
|
|
break
|
|
}
|
|
}
|
|
|
|
if iTop == 0 {
|
|
// all in one module, reset to the end
|
|
iTop = len(finding.Trace) - 1
|
|
}
|
|
|
|
compact := []*govulncheck.Frame{finding.Trace[0]}
|
|
if iTop > 1 {
|
|
if iTop > 2 {
|
|
compact = append(compact, finding.Trace[iTop-2])
|
|
}
|
|
compact = append(compact, finding.Trace[iTop-1])
|
|
}
|
|
if iTop > 0 {
|
|
compact = append(compact, finding.Trace[iTop])
|
|
}
|
|
return compact
|
|
}
|