You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Currently export_extn_metadata! will export the extn_library_create_metadata symbol with C-style linkage. This symbol will return a CExtnMetadata struct which also has C-style memory layout. However CExtnMetadata has fields of String type, which are not ABI stable. This means that plugins compiled using different toolchain versions that what Ripple was compiled in might not agree on the memory layout of a String. This will cause segfaults as the Plugin will construct what it considers to be a String and load_extn_library_metadata() will attempt to call the constructor and read the constructed strings, which have a different memory layout.
Sets to reproduce
Compile local extn plugin with latest Rust version (1.73 as of writing this)
Compile Ripple (because of rust-toolchain.toml version 1.69 of the toolchain will be used)
Move extn shared object to Ripple workspace, update the configuration manifest to load local extn
Run Ripple
Watch the following fireworks
Output from Ripple
2023-11-28-21:14:59.767[DEBUG][ripple_sdk::extn::ffi::ffi_library][gateway]-Symbol extracted from library
log level debug
2023-11-28-21:14:59.768[INFO][ripple_sdk::extn::ffi::ffi_library][sec_manager]-exported symbols in library [{"fulfills":"[\"\\\"json_rpsee\\\"\"]","id":"ripple:extn:jsonrpsee:sec_manager","required_version":"1.0.0"}]
/home/workuser/.cargo/bin/ripple: line 63: 97631 Segmentation fault THUNDER_HOST=${2} cargo run --features local_dev core/main
GDB Stacktrace
(gdb) bt
#0 __memcpy_generic () at ../sysdeps/aarch64/multiarch/../memcpy.S:131
#1 0x0000aaaae4bad9c0 in core::intrinsics::copy_nonoverlapping<u8> () at library/core/src/intrinsics.rs:2374
#2 core::ptr::const_ptr::{impl#0}::copy_to_nonoverlapping<u8> () at library/core/src/ptr/const_ptr.rs:1279
#3 alloc::slice::hack::{impl#1}::to_vec<u8, alloc::alloc::Global> () at library/alloc/src/slice.rs:167
#4 alloc::slice::hack::to_vec<u8, alloc::alloc::Global> () at library/alloc/src/slice.rs:111
#5 alloc::slice::{impl#0}::to_vec_in<u8, alloc::alloc::Global> () at library/alloc/src/slice.rs:441
#6 alloc::vec::{impl#11}::clone<u8, alloc::alloc::Global> () at library/alloc/src/vec/mod.rs:2655
#7 alloc::string::{impl#6}::clone () at library/alloc/src/string.rs:1992
#8 0x0000aaaae46d2700 in ripple_sdk::extn::ffi::ffi_library::{impl#0}::try_into (self=0xaaaaf5ffaf10) at core/sdk/src/extn/ffi/ffi_library.rs:58
#9 0x0000aaaae453ebc8 in ripple_sdk::extn::ffi::ffi_library::load_extn_library_metadata (lib=0xffffce4e8e08)
at core/sdk/src/extn/ffi/ffi_library.rs:177
#10 0x0000aaaae3f8f254 in ripple::bootstrap::extn::load_extn_metadata_step::LoadExtensionMetadataStep::load_extension_library<alloc::string::String> (
filename=..., entry=...) at core/main/src/bootstrap/extn/load_extn_metadata_step.rs:42
#11 0x0000aaaae3f8fcd8 in ripple::bootstrap::extn::load_extn_metadata_step::{impl#1}::setup::{async_block#0} (_task_context=0xffffce4f08c0)
at core/main/src/bootstrap/extn/load_extn_metadata_step.rs:80
#12 0x0000aaaae426f600 in core::future::future::{impl#1}::poll<alloc::boxed::Box<(dyn core::future::future::Future<Output=core::result::Result<(), ripple_sdk::utils::error::RippleError>> + core::marker::Send), alloc::alloc::Global>> (self=..., cx=0xffffce4f08c0)
Solutions
Added a section to the README that specifics that 1.69 must be used.
Instead of using String use a C-Style string (ASCII chars with a null terminator) and then convert to Rust string then you won't have this problem since the ABI will be using C data structures which have been ABI stable.
The text was updated successfully, but these errors were encountered:
Description of Problem
Currently
export_extn_metadata!
will export theextn_library_create_metadata
symbol with C-style linkage. This symbol will return aCExtnMetadata
struct which also has C-style memory layout. HoweverCExtnMetadata
has fields ofString
type, which are not ABI stable. This means that plugins compiled using different toolchain versions that what Ripple was compiled in might not agree on the memory layout of aString
. This will cause segfaults as the Plugin will construct what it considers to be aString
andload_extn_library_metadata()
will attempt to call the constructor and read the constructed strings, which have a different memory layout.Sets to reproduce
1.73
as of writing this)rust-toolchain.toml
version1.69
of the toolchain will be used)Output from Ripple
GDB Stacktrace
Solutions
String
use a C-Style string (ASCII chars with a null terminator) and then convert to Rust string then you won't have this problem since the ABI will be using C data structures which have been ABI stable.The text was updated successfully, but these errors were encountered: