Skip to content

Commit

Permalink
fix(sp-io): Proper alloc panc handling (gear-tech#31)
Browse files Browse the repository at this point in the history
  • Loading branch information
breathx committed Apr 24, 2023
1 parent 4d61aa7 commit 34efda7
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 12 deletions.
1 change: 0 additions & 1 deletion primitives/application-crypto/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -42,5 +42,4 @@ full_crypto = [
# Don't add `panic_handler` and `alloc_error_handler` since they are expected to be provided
# by the user anyway.
"sp-io/disable_panic_handler",
"sp-io/disable_oom",
]
8 changes: 3 additions & 5 deletions primitives/io/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -66,12 +66,11 @@ with-tracing = [
"sp-tracing/with-tracing"
]

# These two features are used for `no_std` builds for the environments which already provides
# `#[panic_handler]`, `#[alloc_error_handler]` and `#[global_allocator]`.
# These two features are used for `no_std` builds for the environments which
# already provides `#[panic_handler]` and `#[global_allocator]`.
#
# For the regular wasm runtime builds those are not used.
disable_panic_handler = []
disable_oom = []
disable_allocator = []

# This feature flag controls the runtime's behavior when encountering
Expand All @@ -85,8 +84,7 @@ disable_allocator = []
# logs, with the caller receving a generic "wasm `unreachable` instruction executed"
# error message.
#
# This has no effect if both `disable_panic_handler` and `disable_oom`
# are enabled.
# This has no effect if `disable_panic_handler` is enabled.
#
# WARNING: Enabling this feature flag requires the `PanicHandler::abort_on_panic`
# host function to be supported by the host. Do *not* enable it for your
Expand Down
32 changes: 26 additions & 6 deletions primitives/io/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@

#![warn(missing_docs)]
#![cfg_attr(not(feature = "std"), no_std)]
#![cfg_attr(
all(not(feature = "disable_panic_handler"), not(feature = "std")),
feature(panic_oom_payload)
)]
#![cfg_attr(
feature = "std",
doc = "Substrate runtime standard library as compiled when linked with Rust's standard library."
Expand Down Expand Up @@ -1771,13 +1775,29 @@ mod allocator_impl {
#[panic_handler]
#[no_mangle]
pub fn panic(info: &core::panic::PanicInfo) -> ! {
let message = sp_std::alloc::format!("{}", info);
#[cfg(feature = "improved_panic_error_reporting")]
{
use sp_std::alloc::{alloc::AllocErrorPanicPayload, format, string::String};

let improved_panic_error_reporting = match () {
#[cfg(feature = "improved_panic_error_reporting")]
() => true,
#[cfg(not(feature = "improved_panic_error_reporting"))]
() => false,
};

let message = info
.payload()
.downcast_ref::<AllocErrorPanicPayload>()
.map(|_| {
let msg = improved_panic_error_reporting
.then_some("Runtime memory exhausted.")
.unwrap_or("Runtime memory exhausted. Aborting");
String::from(msg)
})
.unwrap_or_else(|| format!("{info}"));

if improved_panic_error_reporting {
panic_handler::abort_on_panic(&message);
}
#[cfg(not(feature = "improved_panic_error_reporting"))]
{
} else {
logging::log(LogLevel::Error, "runtime", message.as_bytes());
core::arch::wasm32::unreachable();
}
Expand Down

0 comments on commit 34efda7

Please sign in to comment.