Skip to main content

SkippableFrame

Struct SkippableFrame 

Source
pub struct SkippableFrame { /* private fields */ }
Available on crate feature lsm only.
Expand description

A typed skippable-frame value.

Construct via SkippableFrame::new (validates the variant bound and payload size up front) or SkippableFrame::decode_from. Round-trip a frame via SkippableFrame::encode_into.

Implementations§

Source§

impl SkippableFrame

Source

pub fn new( magic_variant: u8, payload: Vec<u8>, ) -> Result<Self, SkippableFrameError>

Build a SkippableFrame from its components. Validates:

Source

pub fn magic_variant(&self) -> u8

The 4-bit variant nibble. Combined with SKIPPABLE_MAGIC_START to form the on-wire magic number (magic = START + variant).

Source

pub fn magic_number(&self) -> u32

Full 32-bit magic number this frame serialises with.

Source

pub fn payload(&self) -> &[u8]

Payload bytes carried by the frame (without the 8-byte header).

Source

pub fn into_payload(self) -> Vec<u8>

Move the payload out, consuming the frame.

Source

pub fn serialized_size(&self) -> usize

Total serialised size of this frame on the wire: payload.len() + 8 (8 = 4-byte magic + 4-byte length).

Source

pub fn encode_into<W: Write>(&self, writer: &mut W) -> Result<(), Error>

Serialise this frame into writer. Writes serialized_size() bytes total: 4-byte magic LE, 4-byte length LE, payload bytes.

Source

pub fn decode_from<R: Read>( reader: &mut R, ) -> Result<Self, DecodeSkippableFrameError>

Read one skippable frame from reader. Consumes 4-byte magic + 4-byte length + length payload bytes. The caller is responsible for positioning the reader at a frame boundary; this method does not scan past unknown content.

Three layers of protection against crafted-length DoS:

  1. Validates that length is representable on the target pointer width (length + SKIPPABLE_HEADER_SIZE must not overflow usize). On 32-bit targets a wire length near u32::MAX would otherwise overflow serialized_size() and write_skippable_frame_to. Returns DecodeSkippableFrameError::PayloadTooLarge up front.

  2. Reserves the address space via Vec::try_reserve_exact, converting alloc-failure into typed DecodeSkippableFrameError::AllocationFailed instead of process abort.

  3. Reads the payload in fixed-size chunks via a stack scratch buffer, so the OS only commits pages for bytes the reader actually delivers. A crafted length near u32::MAX on a reader that terminates early surfaces as DecodeSkippableFrameError::Payload without ever committing the full allocation — on OSes with memory overcommit (Linux default) where step 2 would otherwise succeed for any nominal size, this is what makes the “no abort on huge length” guarantee actually reliable.

Callers handling untrusted streams should additionally cap the acceptable payload size at the application layer; this method itself imposes no upper bound beyond the wire-format u32::MAX plus target-representability.

Trait Implementations§

Source§

impl Clone for SkippableFrame

Source§

fn clone(&self) -> SkippableFrame

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SkippableFrame

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for SkippableFrame

Source§

fn eq(&self, other: &SkippableFrame) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Eq for SkippableFrame

Source§

impl StructuralPartialEq for SkippableFrame

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.