builtin: add sanity check on the number of returned frames by C.backtrace
							parent
							
								
									3a461e7cee
								
							
						
					
					
						commit
						4568ce8f00
					
				| 
						 | 
				
			
			@ -50,6 +50,10 @@ fn print_backtrace_skipping_top_frames_mac(skipframes int) bool {
 | 
			
		|||
	$if macos {
 | 
			
		||||
		buffer := [100]byteptr
 | 
			
		||||
		nr_ptrs := C.backtrace(buffer, 100)
 | 
			
		||||
		if nr_ptrs < 2 {
 | 
			
		||||
			eprintln('C.backtrace returned less than 2 frames')
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
		C.backtrace_symbols_fd(&buffer[skipframes], nr_ptrs - skipframes, 2)
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
| 
						 | 
				
			
			@ -59,6 +63,10 @@ fn print_backtrace_skipping_top_frames_freebsd(skipframes int) bool {
 | 
			
		|||
	$if freebsd {
 | 
			
		||||
		buffer := [100]byteptr
 | 
			
		||||
		nr_ptrs := C.backtrace(buffer, 100)
 | 
			
		||||
		if nr_ptrs < 2 {
 | 
			
		||||
			eprintln('C.backtrace returned less than 2 frames')
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
		C.backtrace_symbols_fd(&buffer[skipframes], nr_ptrs - skipframes, 2)
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
| 
						 | 
				
			
			@ -81,6 +89,10 @@ fn print_backtrace_skipping_top_frames_linux(skipframes int) bool {
 | 
			
		|||
	}
 | 
			
		||||
	buffer := [100]byteptr
 | 
			
		||||
	nr_ptrs := C.backtrace(buffer, 100)
 | 
			
		||||
	if nr_ptrs < 2 {
 | 
			
		||||
		eprintln('C.backtrace returned less than 2 frames')
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	nr_actual_frames := nr_ptrs - skipframes
 | 
			
		||||
	mut sframes := []string{}
 | 
			
		||||
	//////csymbols := backtrace_symbols(*voidptr(&buffer[skipframes]), nr_actual_frames)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -103,10 +103,14 @@ $if msvc {
 | 
			
		|||
	syminitok := C.SymInitialize( handle, 0, 1)
 | 
			
		||||
	if syminitok != 1 {
 | 
			
		||||
		eprintln('Failed getting process: Aborting backtrace.\n')
 | 
			
		||||
		return true
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	frames := int(C.CaptureStackBackTrace(skipframes + 1, 100, backtraces, 0))
 | 
			
		||||
	if frames < 2 {
 | 
			
		||||
		eprintln('C.CaptureStackBackTrace returned less than 2 frames')
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	for i in 0..frames {
 | 
			
		||||
		frame_addr := backtraces[i]
 | 
			
		||||
		if C.SymFromAddr(handle, frame_addr, &offset, si) == 1 {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue