Skip to content

Commit a7a6d62

Browse files
committed
Properly propagate errors in _Unwind_Backtrace
1 parent 4715bb4 commit a7a6d62

File tree

2 files changed

+23
-11
lines changed

2 files changed

+23
-11
lines changed

unwind/src/lib.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,9 @@ impl ObjectRecord {
130130

131131
if let Some(fde) = target_fde {
132132
trace!("fde {:x} - {:x}", fde.initial_address(), fde.len());
133-
assert!(fde.contains(address));
133+
if !fde.contains(address) {
134+
return Err(gimli::Error::NoUnwindInfoForAddress);
135+
}
134136
let mut result_row = None;
135137
let mut ctx = ctx.initialize(fde.cie()).unwrap();
136138

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)