diff options
author | Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com> | 2023-02-21 12:24:53 +0100 |
---|---|---|
committer | Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com> | 2023-03-30 13:52:32 +0200 |
commit | da81fa1f087b70ab291c87170863eab8a8e1e8d3 (patch) | |
tree | ec9c1b92c2deafce6eb9e133e45fe9bf7d245df4 | |
parent | acf5db71524e56aef7a0071be96299b976760454 (diff) | |
download | gcc-da81fa1f087b70ab291c87170863eab8a8e1e8d3.zip gcc-da81fa1f087b70ab291c87170863eab8a8e1e8d3.tar.gz gcc-da81fa1f087b70ab291c87170863eab8a8e1e8d3.tar.bz2 |
libproc_macro: Manual Clone for Literal
The Literal type may contain foreign byte array when representing a byte
array or a string. This means auto deriving the Clone trait would only
perform a shallow copy of the pointer rather than a deep copy. This
behavior would lead to use-after-free when a literal is cloned and then
dropped.
ChangeLog:
* librust/proc_macro/rust/bridge/literal.rs: Implement Clone
manually.
Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
-rw-r--r-- | librust/proc_macro/rust/bridge/literal.rs | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/librust/proc_macro/rust/bridge/literal.rs b/librust/proc_macro/rust/bridge/literal.rs index e883e6b..3251403 100644 --- a/librust/proc_macro/rust/bridge/literal.rs +++ b/librust/proc_macro/rust/bridge/literal.rs @@ -13,7 +13,7 @@ extern "C" { } #[repr(C)] -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Copy)] pub enum Unsigned { Unsigned8(u8), Unsigned16(u16), @@ -25,7 +25,7 @@ pub enum Unsigned { } #[repr(C)] -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Copy)] pub enum Signed { Signed8(i8), Signed16(i16), @@ -37,7 +37,7 @@ pub enum Signed { } #[repr(C)] -#[derive(Debug, Clone)] +#[derive(Debug)] pub enum Literal { /// String literal internal representation /// @@ -383,3 +383,19 @@ impl FromStr for Literal { } } } + +impl Clone for Literal { + fn clone(&self) -> Self { + match self { + Literal::String { data, len } => unsafe { Literal__string(*data, *len) }, + Literal::ByteString { data, size } => unsafe { Literal__byte_string(*data, *size) }, + Literal::Char(val) => Literal::Char(*val), + Literal::Unsigned(val, suffixed) => Literal::Unsigned(*val, *suffixed), + Literal::Signed(val, suffixed) => Literal::Signed(*val, *suffixed), + Literal::Usize(val, suffixed) => Literal::Usize(*val, *suffixed), + Literal::ISize(val, suffixed) => Literal::ISize(*val, *suffixed), + Literal::Float32(val, suffixed) => Literal::Float32(*val, *suffixed), + Literal::Float64(val, suffixed) => Literal::Float64(*val, *suffixed), + } + } +} |