{{/*
Copyright 2017 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.

Page with details about a single bug.
*/}}

<!doctype html>
<html>
<head>
	{{template "head" .Header}}
	<title>{{.Bug.Title}}</title>
</head>
<body>
	{{template "header" .Header}}

	<b>{{.Bug.Title}}</b><br>
	Status: {{if .Bug.ExternalLink}}<a href="{{.Bug.ExternalLink}}">{{.Bug.Status}}</a>{{else}}{{.Bug.Status}}{{end}}<br>
	Reported-by: {{.Bug.CreditEmail}}<br>
	{{if .Bug.Commits}}
		Fix commit: {{template "fix_commits" .Bug.Commits}}<br>
		{{if .Bug.ClosedTime.IsZero}}
			Patched on: {{.Bug.PatchedOn}}, missing on: {{.Bug.MissingOn}}<br>
		{{end}}
	{{end}}
	First crash: {{formatLateness $.Now $.Bug.FirstTime}}, last: {{formatLateness $.Now $.Bug.LastTime}}<br>

	{{with $bisect := .BisectCause}}<br>
		{{if $bisect.ErrorLink}}
			<b>Bisection: {{link $bisect.ErrorLink "error"}}
			({{link $bisect.LogLink "bisect log"}})</b><br>
		{{else if $bisect.Commit}}{{with $com := $bisect.Commit}}
			<b>Bisection: introduced by
			({{link $bisect.LogLink "bisect log"}}):</b><br>
			<br><span class="mono">
			commit {{$com.Hash}}<br>
			Author: {{$com.Author}}<br>
			Date:   {{formatKernelTime $com.Date}}<br>
			<br>
			&nbsp;&nbsp;{{$com.Title}}<br>
			</span><br>
		{{end}}{{else if $bisect.Commits}}{{with $bisect.Commits}}
			<b>Bisection: the first bad commit could be any of
			({{link $bisect.LogLink "bisect log"}}):</b><br>
			<br><span class="mono">
			{{range $com := $bisect.Commits}}
				&nbsp;&nbsp;{{formatTagHash $com.Hash}} {{$com.Title}}<br>
			{{end}}
			</span><br>
		{{end}}{{else}}
			<b>Bisection: the bug happens on the oldest tested release
			({{link $bisect.LogLink "bisect log"}})</b><br>
		{{end}}
		Tree: <span title="{{$bisect.Manager}}">{{$bisect.KernelAlias}}</span><br>
		{{if $bisect.CrashLogLink}}
			Crash: {{link $bisect.CrashReportLink $bisect.CrashTitle}} ({{link $bisect.CrashLogLink "log"}})<br>
		{{end}}
		Repro: {{optlink $bisect.Crash.ReproCLink "C"}}
			{{optlink $bisect.Crash.ReproSyzLink "syz"}}
			{{optlink $bisect.Crash.KernelConfigLink ".config"}}<br>
	{{end}}

	{{template "bug_list" .DupOf}}
	{{template "bug_list" .Dups}}
	{{template "bug_list" .Similar}}

	{{if .SampleReport}}
	<br><b>Sample crash report:</b><br>
	<textarea id="log_textarea" readonly rows="25" wrap=off>{{printf "%s" .SampleReport}}</textarea><br>
	{{end}}

	<table class="list_table">
		<caption>All crashes ({{.Bug.NumCrashes}}):</caption>
		<thead>
		<tr>
			<th><a onclick="return sortTable(this, 'Manager', textSort)" href="#">Manager</a></th>
			<th><a onclick="return sortTable(this, 'Time', textSort, true)" href="#">Time</a></th>
			<th><a onclick="return sortTable(this, 'Kernel', textSort)" href="#">Kernel</a></th>
			<th><a onclick="return sortTable(this, 'Commit', textSort)" href="#">Commit</a></th>
			<th><a onclick="return sortTable(this, 'Syzkaller', textSort)" href="#">Syzkaller</a></th>
			<th><a onclick="return sortTable(this, 'Config', textSort)" href="#">Config</a></th>
			<th><a onclick="return sortTable(this, 'Log', textSort)" href="#">Log</a></th>
			<th><a onclick="return sortTable(this, 'Report', reproSort)" href="#">Report</a></th>
			<th><a onclick="return sortTable(this, 'Syz repro', reproSort)" href="#">Syz repro</a></th>
			<th><a onclick="return sortTable(this, 'C repro', textSort)" href="#">C repro</a></th>
			{{if $.HasMaintainers}}
			<th><a onclick="return sortTable(this, 'Maintainers', textSort)" href="#">Maintainers</a></th>
			{{end}}
		</tr>
		</thead>
		<tbody>
		{{range $c := $.Crashes}}
			<tr>
				<td class="manager">{{$c.Manager}}</td>
				<td class="time">{{formatTime $c.Time}}</td>
				<td class="kernel" title="{{$c.KernelAlias}}">{{$c.KernelAlias}}</td>
				<td class="tag" title="{{$c.KernelCommit}}
{{formatTime $c.KernelCommitDate}}">{{link $c.KernelCommitLink (formatShortHash $c.KernelCommit)}}</td>
				<td class="tag">{{link $c.SyzkallerCommitLink (formatShortHash $c.SyzkallerCommit)}}</td>
				<td class="config">{{if $c.KernelConfigLink}}<a href="{{$c.KernelConfigLink}}">.config</a>{{end}}</td>
				<td class="repro">{{if $c.LogLink}}<a href="{{$c.LogLink}}">log</a>{{end}}</td>
				<td class="repro">{{if $c.ReportLink}}<a href="{{$c.ReportLink}}">report</a>{{end}}</td>
				<td class="repro">{{if $c.ReproSyzLink}}<a href="{{$c.ReproSyzLink}}">syz</a>{{end}}</td>
				<td class="repro">{{if $c.ReproCLink}}<a href="{{$c.ReproCLink}}">C</a>{{end}}</td>
				{{if $.HasMaintainers}}
				<td class="maintainers" title="{{$c.Maintainers}}">{{$c.Maintainers}}</td>
				{{end}}
			</tr>
		{{end}}
		</tbody>
	</table>
</body>
</html>
