feat(tazjin/german-string): add constructor that leaks a Vec<u8>
Change-Id: Id0b6b4794128573ddb62e82fd77d080e564978be Reviewed-on: https://cl.tvl.fyi/c/depot/+/12264 Tested-by: BuildkiteCI Reviewed-by: tazjin <tazjin@tvl.su> Autosubmit: tazjin <tazjin@tvl.su>
This commit is contained in:
parent
012da7d0e1
commit
8f6f45097e
1 changed files with 29 additions and 2 deletions
|
@ -122,11 +122,11 @@ impl GermanString {
|
||||||
s.data[..bytes.len()].copy_from_slice(&bytes);
|
s.data[..bytes.len()].copy_from_slice(&bytes);
|
||||||
GermanString(GSRepr { small: s })
|
GermanString(GSRepr { small: s })
|
||||||
} else {
|
} else {
|
||||||
let mut md = std::mem::ManuallyDrop::new(bytes);
|
let md = std::mem::ManuallyDrop::new(bytes);
|
||||||
let mut large = GSLarge {
|
let mut large = GSLarge {
|
||||||
len: md.len() as u32,
|
len: md.len() as u32,
|
||||||
prefix: [0u8; 4],
|
prefix: [0u8; 4],
|
||||||
data: StorageClassPtr::transient(md.as_mut_ptr()),
|
data: StorageClassPtr::transient(md.as_ptr()),
|
||||||
};
|
};
|
||||||
|
|
||||||
large.prefix.copy_from_slice(&md[..4]);
|
large.prefix.copy_from_slice(&md[..4]);
|
||||||
|
@ -160,6 +160,33 @@ impl GermanString {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Creates a persistent German String by leaking the provided data.
|
||||||
|
pub fn persistent_leak(bytes: Vec<u8>) -> GermanString {
|
||||||
|
if bytes.len() > u32::MAX as usize {
|
||||||
|
panic!("GermanString maximum length is {} bytes", u32::MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
if bytes.len() <= 12 {
|
||||||
|
let mut s = GSSmall {
|
||||||
|
len: bytes.len() as u32,
|
||||||
|
data: [0u8; 12],
|
||||||
|
};
|
||||||
|
|
||||||
|
s.data[..bytes.len()].copy_from_slice(&bytes);
|
||||||
|
GermanString(GSRepr { small: s })
|
||||||
|
} else {
|
||||||
|
let md = std::mem::ManuallyDrop::new(bytes);
|
||||||
|
let mut large = GSLarge {
|
||||||
|
len: md.len() as u32,
|
||||||
|
prefix: [0u8; 4],
|
||||||
|
data: StorageClassPtr::persistent(md.as_ptr()),
|
||||||
|
};
|
||||||
|
|
||||||
|
large.prefix.copy_from_slice(&md[..4]);
|
||||||
|
GermanString(GSRepr { large })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Creates a persistent German String from a static data buffer.
|
/// Creates a persistent German String from a static data buffer.
|
||||||
pub fn persistent_from_str(s: &'static str) -> GermanString {
|
pub fn persistent_from_str(s: &'static str) -> GermanString {
|
||||||
GermanString::persistent(s.as_bytes())
|
GermanString::persistent(s.as_bytes())
|
||||||
|
|
Loading…
Reference in a new issue