From 6d61c1578f067c1d6b121142cb00b729b92f964f Mon Sep 17 00:00:00 2001 From: Amanieu d'Antras Date: Thu, 2 Dec 2021 11:51:02 +0000 Subject: [PATCH] Add a proper implementation of Clone for C API vector types The previous implementation used a shallow copy, which is incorrect and could lead to a use-after-free. --- crates/c-api/src/vec.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/crates/c-api/src/vec.rs b/crates/c-api/src/vec.rs index 1b45aeff22..9091fa7e20 100644 --- a/crates/c-api/src/vec.rs +++ b/crates/c-api/src/vec.rs @@ -29,7 +29,6 @@ macro_rules! declare_vecs { ))* ) => {$( #[repr(C)] - #[derive(Clone)] pub struct $name { size: usize, data: *mut $elem_ty, @@ -80,6 +79,12 @@ macro_rules! declare_vecs { } } + impl Clone for $name { + fn clone(&self) -> Self { + self.as_slice().to_vec().into() + } + } + impl From> for $name { fn from(vec: Vec<$elem_ty>) -> Self { let mut vec = vec.into_boxed_slice();