Skip to content

Commit eb96f33

Browse files
committed
Properly propagate errors in _Unwind_Backtrace
1 parent 348490d commit eb96f33

File tree

1 file changed

+20
-10
lines changed

1 file changed

+20
-10
lines changed

unwind/src/libunwind_shim.rs

+20-10
Original file line numberDiff line numberDiff line change
@@ -156,17 +156,27 @@ unsafe fn unwind_tracer(mut frames: &mut ::StackFrames, exception: *mut _Unwind_
156156
pub unsafe extern "C" fn _Unwind_Backtrace(trace: _Unwind_Trace_Fn,
157157
trace_argument: *mut c_void)
158158
-> _Unwind_Reason_Code {
159+
let mut reterr = _Unwind_Reason_Code::_URC_END_OF_STACK;
159160
DwarfUnwinder::default().trace(|mut frames| {
160-
while let Some(frame) = frames.next().unwrap() {
161-
let mut ctx = _Unwind_Context {
162-
lsda: frame.lsda.unwrap_or(0),
163-
ip: frames.registers()[DwarfRegister::IP].unwrap(),
164-
initial_address: frame.initial_address,
165-
registers: frames.registers(),
166-
};
167-
168-
trace(&mut ctx, trace_argument);
161+
loop {
162+
match frames.next() {
163+
Ok(Some(frame)) => {
164+
let mut ctx = _Unwind_Context {
165+
lsda: frame.lsda.unwrap_or(0),
166+
ip: frames.registers()[DwarfRegister::IP].unwrap(),
167+
initial_address: frame.initial_address,
168+
registers: frames.registers(),
169+
};
170+
171+
trace(&mut ctx, trace_argument);
172+
},
173+
Ok(None) => break,
174+
Err(err) => {
175+
reterr = _Unwind_Reason_Code::_URC_FATAL_PHASE1_ERROR;
176+
break;
177+
}
178+
}
169179
}
170180
});
171-
_Unwind_Reason_Code::_URC_END_OF_STACK
181+
reterr
172182
}

0 commit comments

Comments
 (0)