repo: Avoid potential double unwind when writing panic value
Thanks to @shinmao for the report! Closes: https://github.com/ostreedev/ostree/issues/2775
This commit is contained in:
parent
9d652be3b1
commit
a4f5645926
|
|
@ -107,18 +107,26 @@ pub(super) unsafe extern "C" fn filter_trampoline_unwindsafe(
|
||||||
///
|
///
|
||||||
/// If the panic value is either `&str` or `String`, we print it. Otherwise, we don't.
|
/// If the panic value is either `&str` or `String`, we print it. Otherwise, we don't.
|
||||||
fn print_panic(panic: Box<dyn Any>) {
|
fn print_panic(panic: Box<dyn Any>) {
|
||||||
eprintln!("A Rust callback invoked by C code panicked.");
|
use std::io::Write;
|
||||||
eprintln!("Unwinding across FFI boundaries is Undefined Behavior so abort() will be called.");
|
let stderr = std::io::stderr();
|
||||||
|
let mut stderr = stderr.lock();
|
||||||
|
// Directly write to stderr instead of eprintln!() as that function panics
|
||||||
|
// if writing fails, which would involve a double panic which we don't want.
|
||||||
|
let _ = stderr.write_all(
|
||||||
|
r#"A Rust callback invoked by C code panicked.
|
||||||
|
Unwinding across FFI boundaries is Undefined Behavior so abort() will be called."#
|
||||||
|
.as_bytes(),
|
||||||
|
);
|
||||||
let msg = {
|
let msg = {
|
||||||
if let Some(s) = panic.as_ref().downcast_ref::<&str>() {
|
if let Some(s) = panic.as_ref().downcast_ref::<&str>() {
|
||||||
s
|
s
|
||||||
} else if let Some(s) = panic.as_ref().downcast_ref::<String>() {
|
} else if let Some(s) = panic.as_ref().downcast_ref::<String>() {
|
||||||
s
|
s
|
||||||
} else {
|
} else {
|
||||||
"UNABLE TO SHOW VALUE OF PANIC"
|
"(non-string panic value)"
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
eprintln!("Panic value: {}", msg);
|
let _ = stderr.write_all(msg.as_bytes());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue