Skip to content

Commit 4568ce8

Browse files
committed
builtin: add sanity check on the number of returned frames by C.backtrace
1 parent 3a461e7 commit 4568ce8

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

vlib/builtin/builtin_nix.c.v

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ fn print_backtrace_skipping_top_frames_mac(skipframes int) bool {
5050
$if macos {
5151
buffer := [100]byteptr
5252
nr_ptrs := C.backtrace(buffer, 100)
53+
if nr_ptrs < 2 {
54+
eprintln('C.backtrace returned less than 2 frames')
55+
return false
56+
}
5357
C.backtrace_symbols_fd(&buffer[skipframes], nr_ptrs - skipframes, 2)
5458
}
5559
return true
@@ -59,6 +63,10 @@ fn print_backtrace_skipping_top_frames_freebsd(skipframes int) bool {
5963
$if freebsd {
6064
buffer := [100]byteptr
6165
nr_ptrs := C.backtrace(buffer, 100)
66+
if nr_ptrs < 2 {
67+
eprintln('C.backtrace returned less than 2 frames')
68+
return false
69+
}
6270
C.backtrace_symbols_fd(&buffer[skipframes], nr_ptrs - skipframes, 2)
6371
}
6472
return true
@@ -81,6 +89,10 @@ fn print_backtrace_skipping_top_frames_linux(skipframes int) bool {
8189
}
8290
buffer := [100]byteptr
8391
nr_ptrs := C.backtrace(buffer, 100)
92+
if nr_ptrs < 2 {
93+
eprintln('C.backtrace returned less than 2 frames')
94+
return false
95+
}
8496
nr_actual_frames := nr_ptrs - skipframes
8597
mut sframes := []string{}
8698
//////csymbols := backtrace_symbols(*voidptr(&buffer[skipframes]), nr_actual_frames)

vlib/builtin/builtin_windows.c.v

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,14 @@ $if msvc {
103103
syminitok := C.SymInitialize( handle, 0, 1)
104104
if syminitok != 1 {
105105
eprintln('Failed getting process: Aborting backtrace.\n')
106-
return true
106+
return false
107107
}
108108

109109
frames := int(C.CaptureStackBackTrace(skipframes + 1, 100, backtraces, 0))
110+
if frames < 2 {
111+
eprintln('C.CaptureStackBackTrace returned less than 2 frames')
112+
return false
113+
}
110114
for i in 0..frames {
111115
frame_addr := backtraces[i]
112116
if C.SymFromAddr(handle, frame_addr, &offset, si) == 1 {

0 commit comments

Comments
 (0)