Try fixing middleware failure.

This commit is contained in:
losfair
2019-11-22 01:46:02 +08:00
parent 6f3e6fab3b
commit 4ec4fcf28a

View File

@ -284,48 +284,50 @@ extern "C" fn signal_trap_handler(
unsafe { unsafe {
let fault = get_fault_info(siginfo as _, ucontext); let fault = get_fault_info(siginfo as _, ucontext);
let early_return = CURRENT_CODE_VERSIONS.with(|versions| { let early_return = allocate_and_run(TRAP_STACK_SIZE, || {
let versions = versions.borrow(); CURRENT_CODE_VERSIONS.with(|versions| {
for v in versions.iter() { let versions = versions.borrow();
let magic_size = if let Some(x) = get_inline_breakpoint_size(ARCH, v.backend) { for v in versions.iter() {
x let magic_size = if let Some(x) = get_inline_breakpoint_size(ARCH, v.backend) {
} else { x
continue; } else {
}; continue;
let ip = fault.ip.get(); };
let end = v.base + v.msm.total_size; let ip = fault.ip.get();
if ip >= v.base && ip < end && ip + magic_size <= end { let end = v.base + v.msm.total_size;
if let Some(ib) = read_inline_breakpoint( if ip >= v.base && ip < end && ip + magic_size <= end {
ARCH, if let Some(ib) = read_inline_breakpoint(
v.backend, ARCH,
std::slice::from_raw_parts(ip as *const u8, magic_size), v.backend,
) { std::slice::from_raw_parts(ip as *const u8, magic_size),
match ib.ty { ) {
InlineBreakpointType::Trace => {} match ib.ty {
InlineBreakpointType::Middleware => { InlineBreakpointType::Trace => {}
let out: Option<Result<(), Box<dyn Any>>> = InlineBreakpointType::Middleware => {
with_breakpoint_map(|bkpt_map| { let out: Option<Result<(), Box<dyn Any>>> =
bkpt_map.and_then(|x| x.get(&ip)).map(|x| { with_breakpoint_map(|bkpt_map| {
x(BreakpointInfo { bkpt_map.and_then(|x| x.get(&ip)).map(|x| {
fault: Some(&fault), x(BreakpointInfo {
fault: Some(&fault),
})
}) })
}) });
}); if let Some(Ok(())) = out {
if let Some(Ok(())) = out { } else {
} else { println!("Failed calling middleware: {:?}", out);
println!("Failed calling middleware: {:?}", out); }
} }
_ => println!("Unknown breakpoint type: {:?}", ib.ty),
} }
_ => println!("Unknown breakpoint type: {:?}", ib.ty),
}
fault.ip.set(ip + magic_size); fault.ip.set(ip + magic_size);
return true; return true;
}
break;
} }
break;
} }
} false
false })
}); });
if early_return { if early_return {
return; return;