Replace sys_common::util::report_overflow
with rterr!
This commit is contained in:
parent
b987f74f05
commit
236705f3c3
@ -42,6 +42,7 @@ mod imp {
|
|||||||
use crate::io;
|
use crate::io;
|
||||||
use crate::mem;
|
use crate::mem;
|
||||||
use crate::ptr;
|
use crate::ptr;
|
||||||
|
use crate::thread;
|
||||||
|
|
||||||
use libc::MAP_FAILED;
|
use libc::MAP_FAILED;
|
||||||
use libc::{mmap, munmap};
|
use libc::{mmap, munmap};
|
||||||
@ -95,15 +96,16 @@ mod imp {
|
|||||||
info: *mut libc::siginfo_t,
|
info: *mut libc::siginfo_t,
|
||||||
_data: *mut libc::c_void,
|
_data: *mut libc::c_void,
|
||||||
) {
|
) {
|
||||||
use crate::sys_common::util::report_overflow;
|
|
||||||
|
|
||||||
let guard = thread_info::stack_guard().unwrap_or(0..0);
|
let guard = thread_info::stack_guard().unwrap_or(0..0);
|
||||||
let addr = siginfo_si_addr(info);
|
let addr = siginfo_si_addr(info);
|
||||||
|
|
||||||
// If the faulting address is within the guard page, then we print a
|
// If the faulting address is within the guard page, then we print a
|
||||||
// message saying so and abort.
|
// message saying so and abort.
|
||||||
if guard.start <= addr && addr < guard.end {
|
if guard.start <= addr && addr < guard.end {
|
||||||
report_overflow();
|
rterr!(
|
||||||
|
"\nthread '{}' has overflowed its stack\n",
|
||||||
|
thread::current().name().unwrap_or("<unknown>")
|
||||||
|
);
|
||||||
rtabort!("stack overflow");
|
rtabort!("stack overflow");
|
||||||
} else {
|
} else {
|
||||||
// Unregister ourselves by reverting back to the default behavior.
|
// Unregister ourselves by reverting back to the default behavior.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#![cfg_attr(test, allow(dead_code))]
|
#![cfg_attr(test, allow(dead_code))]
|
||||||
|
|
||||||
use crate::sys::c;
|
use crate::sys::c;
|
||||||
use crate::sys_common::util::report_overflow;
|
use crate::thread;
|
||||||
|
|
||||||
pub struct Handler;
|
pub struct Handler;
|
||||||
|
|
||||||
@ -24,7 +24,10 @@ extern "system" fn vectored_handler(ExceptionInfo: *mut c::EXCEPTION_POINTERS) -
|
|||||||
let code = rec.ExceptionCode;
|
let code = rec.ExceptionCode;
|
||||||
|
|
||||||
if code == c::EXCEPTION_STACK_OVERFLOW {
|
if code == c::EXCEPTION_STACK_OVERFLOW {
|
||||||
report_overflow();
|
rterr!(
|
||||||
|
"\nthread '{}' has overflowed its stack\n",
|
||||||
|
thread::current().name().unwrap_or("<unknown>")
|
||||||
|
);
|
||||||
}
|
}
|
||||||
c::EXCEPTION_CONTINUE_SEARCH
|
c::EXCEPTION_CONTINUE_SEARCH
|
||||||
}
|
}
|
||||||
|
@ -1,18 +1,9 @@
|
|||||||
use crate::fmt;
|
use crate::fmt;
|
||||||
use crate::io::prelude::*;
|
use crate::io::prelude::*;
|
||||||
use crate::sys::stdio::panic_output;
|
use crate::sys::stdio::panic_output;
|
||||||
use crate::thread;
|
|
||||||
|
|
||||||
pub fn dumb_print(args: fmt::Arguments<'_>) {
|
pub fn dumb_print(args: fmt::Arguments<'_>) {
|
||||||
if let Some(mut out) = panic_output() {
|
if let Some(mut out) = panic_output() {
|
||||||
let _ = out.write_fmt(args);
|
let _ = out.write_fmt(args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(dead_code)] // stack overflow detection not enabled on all platforms
|
|
||||||
pub unsafe fn report_overflow() {
|
|
||||||
dumb_print(format_args!(
|
|
||||||
"\nthread '{}' has overflowed its stack\n",
|
|
||||||
thread::current().name().unwrap_or("<unknown>")
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user