Skip to content

Commit b785826

Browse files
committed
Move called function and error into handle_vm_panic
1 parent 7dd9fa5 commit b785826

File tree

3 files changed

+23
-24
lines changed

3 files changed

+23
-24
lines changed

libwasmvm/src/cache.rs

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,7 @@ pub extern "C" fn init_cache(
3232
error_msg: Option<&mut UnmanagedVector>,
3333
) -> *mut cache_t {
3434
let r = catch_unwind(|| do_init_cache(config)).unwrap_or_else(|err| {
35-
eprintln!("Panic in do_init_cache: {err:?}");
36-
handle_vm_panic();
35+
handle_vm_panic("do_init_cache", err);
3736
Err(Error::panic())
3837
});
3938
handle_c_error_ptr(r, error_msg) as *mut cache_t
@@ -58,8 +57,7 @@ pub extern "C" fn save_wasm(
5857
let r = match to_cache(cache) {
5958
Some(c) => catch_unwind(AssertUnwindSafe(move || do_save_wasm(c, wasm, unchecked)))
6059
.unwrap_or_else(|err| {
61-
eprintln!("Panic in do_save_wasm: {err:?}");
62-
handle_vm_panic();
60+
handle_vm_panic("do_save_wasm", err);
6361
Err(Error::panic())
6462
}),
6563
None => Err(Error::unset_arg(CACHE_ARG)),
@@ -91,8 +89,7 @@ pub extern "C" fn remove_wasm(
9189
let r = match to_cache(cache) {
9290
Some(c) => catch_unwind(AssertUnwindSafe(move || do_remove_wasm(c, checksum)))
9391
.unwrap_or_else(|err| {
94-
eprintln!("Panic in do_remove_wasm: {err:?}");
95-
handle_vm_panic();
92+
handle_vm_panic("do_remove_wasm", err);
9693
Err(Error::panic())
9794
}),
9895
None => Err(Error::unset_arg(CACHE_ARG)),
@@ -121,8 +118,7 @@ pub extern "C" fn load_wasm(
121118
let r = match to_cache(cache) {
122119
Some(c) => catch_unwind(AssertUnwindSafe(move || do_load_wasm(c, checksum)))
123120
.unwrap_or_else(|err| {
124-
eprintln!("Panic in do_load_wasm: {err:?}");
125-
handle_vm_panic();
121+
handle_vm_panic("do_load_wasm", err);
126122
Err(Error::panic())
127123
}),
128124
None => Err(Error::unset_arg(CACHE_ARG)),
@@ -152,8 +148,7 @@ pub extern "C" fn pin(
152148
let r = match to_cache(cache) {
153149
Some(c) => {
154150
catch_unwind(AssertUnwindSafe(move || do_pin(c, checksum))).unwrap_or_else(|err| {
155-
eprintln!("Panic in do_pin: {err:?}");
156-
handle_vm_panic();
151+
handle_vm_panic("do_pin", err);
157152
Err(Error::panic())
158153
})
159154
}
@@ -183,8 +178,7 @@ pub extern "C" fn unpin(
183178
let r = match to_cache(cache) {
184179
Some(c) => {
185180
catch_unwind(AssertUnwindSafe(move || do_unpin(c, checksum))).unwrap_or_else(|err| {
186-
eprintln!("Panic in do_unpin: {err:?}");
187-
handle_vm_panic();
181+
handle_vm_panic("do_unpin", err);
188182
Err(Error::panic())
189183
})
190184
}
@@ -292,8 +286,7 @@ pub extern "C" fn analyze_code(
292286
let r = match to_cache(cache) {
293287
Some(c) => catch_unwind(AssertUnwindSafe(move || do_analyze_code(c, checksum)))
294288
.unwrap_or_else(|err| {
295-
eprintln!("Panic in do_analyze_code: {err:?}");
296-
handle_vm_panic();
289+
handle_vm_panic("do_analyze_code", err);
297290
Err(Error::panic())
298291
}),
299292
None => Err(Error::unset_arg(CACHE_ARG)),
@@ -371,8 +364,7 @@ pub extern "C" fn get_metrics(
371364
let r = match to_cache(cache) {
372365
Some(c) => {
373366
catch_unwind(AssertUnwindSafe(move || do_get_metrics(c))).unwrap_or_else(|err| {
374-
eprintln!("Panic in do_get_metrics: {err:?}");
375-
handle_vm_panic();
367+
handle_vm_panic("do_get_metrics", err);
376368
Err(Error::panic())
377369
})
378370
}
@@ -427,8 +419,7 @@ pub extern "C" fn get_pinned_metrics(
427419
let r = match to_cache(cache) {
428420
Some(c) => {
429421
catch_unwind(AssertUnwindSafe(move || do_get_pinned_metrics(c))).unwrap_or_else(|err| {
430-
eprintln!("Panic in do_get_pinned_metrics: {err:?}");
431-
handle_vm_panic();
422+
handle_vm_panic("do_get_pinned_metrics", err);
432423
Err(Error::panic())
433424
})
434425
}

libwasmvm/src/calls.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -529,8 +529,7 @@ fn call_2_args(
529529
)
530530
}))
531531
.unwrap_or_else(|err| {
532-
eprintln!("Panic in do_call_2_args: {err:?}");
533-
handle_vm_panic();
532+
handle_vm_panic("do_call_2_args", err);
534533
Err(Error::panic())
535534
}),
536535
None => Err(Error::unset_arg(CACHE_ARG)),
@@ -624,8 +623,7 @@ fn call_3_args(
624623
)
625624
}))
626625
.unwrap_or_else(|err| {
627-
eprintln!("Panic in do_call_3_args: {err:?}");
628-
handle_vm_panic();
626+
handle_vm_panic("do_call_3_args", err);
629627
Err(Error::panic())
630628
}),
631629
None => Err(Error::unset_arg(CACHE_ARG)),

libwasmvm/src/handle_vm_panic.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1+
use std::any::Any;
2+
13
/// A function to process cases in which the VM panics.
24
///
35
/// We want to provide as much debug information as possible
46
/// as those cases are not expated to happen during healthy operations.
5-
pub fn handle_vm_panic() {
7+
pub fn handle_vm_panic(what: &str, err: Box<dyn Any + Send + 'static>) {
8+
eprintln!("Panic in {what}:");
9+
eprintln!("{err:?}"); // Does not show useful information, see https://users.rust-lang.org/t/return-value-from-catch-unwind-is-a-useless-any/89134/6
610
eprintln!(
711
"This indicates a panic in during the operations of libwasmvm/cosmwasm-vm.
812
Such panics must not happen and are considered bugs. If you see this in any real-world or
@@ -17,8 +21,14 @@ Thank you for your help keeping CosmWasm safe and secure 💚"
1721
mod tests {
1822
use super::*;
1923

24+
use std::panic::catch_unwind;
25+
2026
#[test]
2127
fn handle_vm_panic_works() {
22-
handle_vm_panic();
28+
fn nice_try() {
29+
panic!("oh no!");
30+
}
31+
let err = catch_unwind(nice_try).unwrap_err();
32+
handle_vm_panic("nice_try", err);
2333
}
2434
}

0 commit comments

Comments
 (0)