Skip to content

Commit 386245b

Browse files
kyakdanmknyszek
authored andcommitted
runtime: fix stack split at bad time when fuzzing
Fix #53190 Change-Id: I6c1f9c3ab58818d3a9f05ddaa02fc247e53677d3 GitHub-Last-Rev: 13b0749 GitHub-Pull-Request: #53191 Reviewed-on: https://go-review.googlesource.com/c/go/+/410034 Reviewed-by: Michael Knyszek <[email protected]> Reviewed-by: Dmitri Shuralyov <[email protected]>
1 parent 2cfbef4 commit 386245b

File tree

1 file changed

+12
-0
lines changed

1 file changed

+12
-0
lines changed

src/runtime/libfuzzer.go

+12
Original file line numberDiff line numberDiff line change
@@ -15,41 +15,53 @@ func libfuzzerCall4(fn *byte, fakePC uintptr, s1, s2 unsafe.Pointer, result uint
1515
// Keep in sync with the definition of ret_sled in src/runtime/libfuzzer_amd64.s
1616
const retSledSize = 512
1717

18+
// In libFuzzer mode, the compiler inserts calls to libfuzzerTraceCmpN and libfuzzerTraceConstCmpN
19+
// (where N can be 1, 2, 4, or 8) for encountered integer comparisons in the code to be instrumented.
20+
// This may result in these functions having callers that are nosplit. That is why they must be nosplit.
21+
//
22+
//go:nosplit
1823
func libfuzzerTraceCmp1(arg0, arg1 uint8, fakePC int) {
1924
fakePC = fakePC % retSledSize
2025
libfuzzerCallTraceIntCmp(&__sanitizer_cov_trace_cmp1, uintptr(arg0), uintptr(arg1), uintptr(fakePC))
2126
}
2227

28+
//go:nosplit
2329
func libfuzzerTraceCmp2(arg0, arg1 uint16, fakePC int) {
2430
fakePC = fakePC % retSledSize
2531
libfuzzerCallTraceIntCmp(&__sanitizer_cov_trace_cmp2, uintptr(arg0), uintptr(arg1), uintptr(fakePC))
2632
}
2733

34+
//go:nosplit
2835
func libfuzzerTraceCmp4(arg0, arg1 uint32, fakePC int) {
2936
fakePC = fakePC % retSledSize
3037
libfuzzerCallTraceIntCmp(&__sanitizer_cov_trace_cmp4, uintptr(arg0), uintptr(arg1), uintptr(fakePC))
3138
}
3239

40+
//go:nosplit
3341
func libfuzzerTraceCmp8(arg0, arg1 uint64, fakePC int) {
3442
fakePC = fakePC % retSledSize
3543
libfuzzerCallTraceIntCmp(&__sanitizer_cov_trace_cmp8, uintptr(arg0), uintptr(arg1), uintptr(fakePC))
3644
}
3745

46+
//go:nosplit
3847
func libfuzzerTraceConstCmp1(arg0, arg1 uint8, fakePC int) {
3948
fakePC = fakePC % retSledSize
4049
libfuzzerCallTraceIntCmp(&__sanitizer_cov_trace_const_cmp1, uintptr(arg0), uintptr(arg1), uintptr(fakePC))
4150
}
4251

52+
//go:nosplit
4353
func libfuzzerTraceConstCmp2(arg0, arg1 uint16, fakePC int) {
4454
fakePC = fakePC % retSledSize
4555
libfuzzerCallTraceIntCmp(&__sanitizer_cov_trace_const_cmp2, uintptr(arg0), uintptr(arg1), uintptr(fakePC))
4656
}
4757

58+
//go:nosplit
4859
func libfuzzerTraceConstCmp4(arg0, arg1 uint32, fakePC int) {
4960
fakePC = fakePC % retSledSize
5061
libfuzzerCallTraceIntCmp(&__sanitizer_cov_trace_const_cmp4, uintptr(arg0), uintptr(arg1), uintptr(fakePC))
5162
}
5263

64+
//go:nosplit
5365
func libfuzzerTraceConstCmp8(arg0, arg1 uint64, fakePC int) {
5466
fakePC = fakePC % retSledSize
5567
libfuzzerCallTraceIntCmp(&__sanitizer_cov_trace_const_cmp8, uintptr(arg0), uintptr(arg1), uintptr(fakePC))

0 commit comments

Comments
 (0)