From 76484b6fe035e14867c795c2f62e589cec5d8c6f Mon Sep 17 00:00:00 2001 From: Vladislav Melnik Date: Mon, 21 Oct 2024 15:49:55 +0200 Subject: [PATCH 1/5] Correctly deallocate external typed data --- src/into_dart.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/into_dart.rs b/src/into_dart.rs index f9bf162..45038e4 100644 --- a/src/into_dart.rs +++ b/src/into_dart.rs @@ -184,6 +184,10 @@ where assert_eq!(length, vec.capacity()); let ptr = vec.as_mut_ptr(); + let raw_slice = Box::into_raw(Box::new( + std::ptr::slice_from_raw_parts_mut(ptr, length), + )); + DartCObject { ty: DartCObjectType::DartExternalTypedData, value: DartCObjectValue { @@ -191,7 +195,7 @@ where ty: T::dart_typed_data_type(), length: length as isize, data: ptr as *mut u8, - peer: ptr as *mut c_void, + peer: raw_slice as *mut c_void, callback: T::function_pointer_of_free_zero_copy_buffer(), }, }, @@ -253,12 +257,12 @@ macro_rules! dart_typed_data_type_trait_impl { #[doc(hidden)] #[no_mangle] pub(crate) unsafe extern "C" fn $free_zero_copy_buffer_func( - isolate_callback_data: *mut c_void, + _isolate_callback_data: *mut c_void, peer: *mut c_void, ) { - let len = (isolate_callback_data as isize) as usize; - let ptr = peer as *mut $rust_type; - drop(Vec::from_raw_parts(ptr, len, len)); + let raw_slice = Box::from_raw(peer.cast::<*mut [u8]>()); + let len = raw_slice.len(); + drop(Vec::from_raw_parts(raw_slice.cast::(), len, len)); } )+ From a66300326e26014a2cc22129cf07b51175fe87ec Mon Sep 17 00:00:00 2001 From: shekohex Date: Mon, 21 Oct 2024 20:35:06 +0300 Subject: [PATCH 2/5] ci: use stable rust for CI --- .github/workflows/valgrind.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/valgrind.yml b/.github/workflows/valgrind.yml index 0da6c18..afd3e3a 100644 --- a/.github/workflows/valgrind.yml +++ b/.github/workflows/valgrind.yml @@ -10,11 +10,11 @@ jobs: - name: Checkout sources uses: actions/checkout@v2 - - name: Install nightly toolchain + - name: Install stable toolchain uses: actions-rs/toolchain@v1 with: profile: minimal - toolchain: nightly + toolchain: stable override: true # - name: Install valgrind From 535930bef94fc6f7a3544cde22390176c950db23 Mon Sep 17 00:00:00 2001 From: shekohex Date: Mon, 21 Oct 2024 20:38:26 +0300 Subject: [PATCH 3/5] chore: update Valgrind to 3.23.0 --- .github/workflows/valgrind.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/valgrind.yml b/.github/workflows/valgrind.yml index afd3e3a..7a49d61 100644 --- a/.github/workflows/valgrind.yml +++ b/.github/workflows/valgrind.yml @@ -23,7 +23,7 @@ jobs: - name: Install valgrind run: | sudo apt update && sudo apt install -y libclang-dev libc6-dbg \ - && wget -O valgrind.tar.bz2 https://sourceware.org/pub/valgrind/valgrind-3.19.0.tar.bz2 \ + && wget -O valgrind.tar.bz2 https://sourceware.org/pub/valgrind/valgrind-3.23.0.tar.bz2 \ && mkdir valgrind && tar -xvjf valgrind.tar.bz2 -C valgrind --strip-components=1 \ && cd valgrind && ./configure && make && sudo make install From fd573b20f50242408095f00359a1f274402623c5 Mon Sep 17 00:00:00 2001 From: Vladislav Melnik Date: Tue, 22 Oct 2024 08:05:49 +0200 Subject: [PATCH 4/5] (fix): apply review suggestion --- src/into_dart.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/into_dart.rs b/src/into_dart.rs index 45038e4..6e33746 100644 --- a/src/into_dart.rs +++ b/src/into_dart.rs @@ -260,9 +260,9 @@ macro_rules! dart_typed_data_type_trait_impl { _isolate_callback_data: *mut c_void, peer: *mut c_void, ) { - let raw_slice = Box::from_raw(peer.cast::<*mut [u8]>()); + let raw_slice = Box::from_raw(peer.cast::<*mut [$rust_type]>()); let len = raw_slice.len(); - drop(Vec::from_raw_parts(raw_slice.cast::(), len, len)); + drop(Vec::from_raw_parts(raw_slice.cast::<$rust_type>(), len, len)); } )+ From 848cac988e0da5a749c557f1418c69dd035aae7a Mon Sep 17 00:00:00 2001 From: Vladislav Melnik Date: Tue, 22 Oct 2024 10:00:58 +0200 Subject: [PATCH 5/5] (fix): simplify --- src/into_dart.rs | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/into_dart.rs b/src/into_dart.rs index 6e33746..59ffcf7 100644 --- a/src/into_dart.rs +++ b/src/into_dart.rs @@ -178,16 +178,12 @@ where }; } - let mut vec = ManuallyDrop::new(vec_from_rust); + let mut vec = vec_from_rust; vec.shrink_to_fit(); let length = vec.len(); assert_eq!(length, vec.capacity()); let ptr = vec.as_mut_ptr(); - let raw_slice = Box::into_raw(Box::new( - std::ptr::slice_from_raw_parts_mut(ptr, length), - )); - DartCObject { ty: DartCObjectType::DartExternalTypedData, value: DartCObjectValue { @@ -195,7 +191,7 @@ where ty: T::dart_typed_data_type(), length: length as isize, data: ptr as *mut u8, - peer: raw_slice as *mut c_void, + peer: Box::into_raw(Box::new(vec)).cast(), callback: T::function_pointer_of_free_zero_copy_buffer(), }, }, @@ -260,9 +256,7 @@ macro_rules! dart_typed_data_type_trait_impl { _isolate_callback_data: *mut c_void, peer: *mut c_void, ) { - let raw_slice = Box::from_raw(peer.cast::<*mut [$rust_type]>()); - let len = raw_slice.len(); - drop(Vec::from_raw_parts(raw_slice.cast::<$rust_type>(), len, len)); + drop(Box::from_raw(peer.cast::>())); } )+