Previously we'd blindly clone'd the fields, which, if
`data_is_owned` is set, will always result in a a double-free.
Instead, we always clone the underlying bytes, setting
`data_is_owned` on the returned value since its likely the caller
wants to hold onto the string outside of the current context.
}
#[repr(C)]
-#[derive(Clone)]
/// A Rust str object, ie a reference to a UTF8-valid string.
/// This is *not* null-terminated so cannot be used directly as a C string!
pub struct Str {
Str { chars: s.as_ptr(), len: s.len(), chars_is_owned: true }
}
}
+impl Clone for Str {
+ fn clone(&self) -> Self {
+ self.into_str().clone().into()
+ }
+}
impl Drop for Str {
fn drop(&mut self) {