forked from BigfootDev/flatbuffers
Rust soundness fixes (#7518)
* Rust soundness fixes * Second pass * Make init_from_table unsafe * Remove SafeSliceAccess * Clippy * Remove create_vector_of_strings * More clippy * Remove deprecated root type accessors * More soundness fixes * Fix EndianScalar for bool * Add TriviallyTransmutable * Add debug assertions * Review comments * Review feedback
This commit is contained in:
committed by
GitHub
parent
dadbff5714
commit
374f8fb5fb
@@ -112,10 +112,7 @@ impl<'a, T: 'a> WIPOffset<T> {
|
||||
/// Create a new WIPOffset.
|
||||
#[inline]
|
||||
pub fn new(o: UOffsetT) -> WIPOffset<T> {
|
||||
WIPOffset {
|
||||
0: o,
|
||||
1: PhantomData,
|
||||
}
|
||||
WIPOffset(o, PhantomData)
|
||||
}
|
||||
|
||||
/// Return a wrapped value that brings its meaning as a union WIPOffset
|
||||
@@ -135,11 +132,9 @@ impl<T> Push for WIPOffset<T> {
|
||||
type Output = ForwardsUOffset<T>;
|
||||
|
||||
#[inline(always)]
|
||||
fn push(&self, dst: &mut [u8], rest: &[u8]) {
|
||||
let n = (SIZE_UOFFSET + rest.len() - self.value() as usize) as UOffsetT;
|
||||
unsafe {
|
||||
emplace_scalar::<UOffsetT>(dst, n);
|
||||
}
|
||||
unsafe fn push(&self, dst: &mut [u8], written_len: usize) {
|
||||
let n = (SIZE_UOFFSET + written_len - self.value() as usize) as UOffsetT;
|
||||
emplace_scalar::<UOffsetT>(dst, n);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -147,8 +142,8 @@ impl<T> Push for ForwardsUOffset<T> {
|
||||
type Output = Self;
|
||||
|
||||
#[inline(always)]
|
||||
fn push(&self, dst: &mut [u8], rest: &[u8]) {
|
||||
self.value().push(dst, rest);
|
||||
unsafe fn push(&self, dst: &mut [u8], written_len: usize) {
|
||||
self.value().push(dst, written_len);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -179,9 +174,9 @@ impl<T> ForwardsUOffset<T> {
|
||||
impl<'a, T: Follow<'a>> Follow<'a> for ForwardsUOffset<T> {
|
||||
type Inner = T::Inner;
|
||||
#[inline(always)]
|
||||
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
let slice = &buf[loc..loc + SIZE_UOFFSET];
|
||||
let off = unsafe { read_scalar::<u32>(slice) as usize };
|
||||
let off = read_scalar::<u32>(slice) as usize;
|
||||
T::follow(buf, loc + off)
|
||||
}
|
||||
}
|
||||
@@ -200,9 +195,9 @@ impl<T> ForwardsVOffset<T> {
|
||||
impl<'a, T: Follow<'a>> Follow<'a> for ForwardsVOffset<T> {
|
||||
type Inner = T::Inner;
|
||||
#[inline(always)]
|
||||
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
let slice = &buf[loc..loc + SIZE_VOFFSET];
|
||||
let off = unsafe { read_scalar::<VOffsetT>(slice) as usize };
|
||||
let off = read_scalar::<VOffsetT>(slice) as usize;
|
||||
T::follow(buf, loc + off)
|
||||
}
|
||||
}
|
||||
@@ -211,8 +206,8 @@ impl<T> Push for ForwardsVOffset<T> {
|
||||
type Output = Self;
|
||||
|
||||
#[inline]
|
||||
fn push(&self, dst: &mut [u8], rest: &[u8]) {
|
||||
self.value().push(dst, rest);
|
||||
unsafe fn push(&self, dst: &mut [u8], written_len: usize) {
|
||||
self.value().push(dst, written_len);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -230,9 +225,9 @@ impl<T> BackwardsSOffset<T> {
|
||||
impl<'a, T: Follow<'a>> Follow<'a> for BackwardsSOffset<T> {
|
||||
type Inner = T::Inner;
|
||||
#[inline(always)]
|
||||
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
let slice = &buf[loc..loc + SIZE_SOFFSET];
|
||||
let off = unsafe { read_scalar::<SOffsetT>(slice) };
|
||||
let off = read_scalar::<SOffsetT>(slice);
|
||||
T::follow(buf, (loc as SOffsetT - off) as usize)
|
||||
}
|
||||
}
|
||||
@@ -241,8 +236,8 @@ impl<T> Push for BackwardsSOffset<T> {
|
||||
type Output = Self;
|
||||
|
||||
#[inline]
|
||||
fn push(&self, dst: &mut [u8], rest: &[u8]) {
|
||||
self.value().push(dst, rest);
|
||||
unsafe fn push(&self, dst: &mut [u8], written_len: usize) {
|
||||
self.value().push(dst, written_len);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -252,7 +247,7 @@ pub struct SkipSizePrefix<T>(PhantomData<T>);
|
||||
impl<'a, T: Follow<'a> + 'a> Follow<'a> for SkipSizePrefix<T> {
|
||||
type Inner = T::Inner;
|
||||
#[inline(always)]
|
||||
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
T::follow(buf, loc + SIZE_SIZEPREFIX)
|
||||
}
|
||||
}
|
||||
@@ -263,7 +258,7 @@ pub struct SkipRootOffset<T>(PhantomData<T>);
|
||||
impl<'a, T: Follow<'a> + 'a> Follow<'a> for SkipRootOffset<T> {
|
||||
type Inner = T::Inner;
|
||||
#[inline(always)]
|
||||
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
T::follow(buf, loc + SIZE_UOFFSET)
|
||||
}
|
||||
}
|
||||
@@ -274,7 +269,7 @@ pub struct FileIdentifier;
|
||||
impl<'a> Follow<'a> for FileIdentifier {
|
||||
type Inner = &'a [u8];
|
||||
#[inline(always)]
|
||||
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
&buf[loc..loc + FILE_IDENTIFIER_LENGTH]
|
||||
}
|
||||
}
|
||||
@@ -286,7 +281,7 @@ pub struct SkipFileIdentifier<T>(PhantomData<T>);
|
||||
impl<'a, T: Follow<'a> + 'a> Follow<'a> for SkipFileIdentifier<T> {
|
||||
type Inner = T::Inner;
|
||||
#[inline(always)]
|
||||
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
T::follow(buf, loc + FILE_IDENTIFIER_LENGTH)
|
||||
}
|
||||
}
|
||||
@@ -294,8 +289,8 @@ impl<'a, T: Follow<'a> + 'a> Follow<'a> for SkipFileIdentifier<T> {
|
||||
impl<'a> Follow<'a> for bool {
|
||||
type Inner = bool;
|
||||
#[inline(always)]
|
||||
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
unsafe { read_scalar_at::<u8>(buf, loc) != 0 }
|
||||
unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
read_scalar_at::<u8>(buf, loc) != 0
|
||||
}
|
||||
}
|
||||
|
||||
@@ -309,8 +304,8 @@ macro_rules! impl_follow_for_endian_scalar {
|
||||
impl<'a> Follow<'a> for $ty {
|
||||
type Inner = $ty;
|
||||
#[inline(always)]
|
||||
fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
unsafe { read_scalar_at::<$ty>(buf, loc) }
|
||||
unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner {
|
||||
read_scalar_at::<$ty>(buf, loc)
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user