Enum rsvg::ImplementationLimit
source · #[non_exhaustive]pub enum ImplementationLimit {
TooManyReferencedElements,
TooManyLoadedElements,
TooManyAttributes,
MaximumLayerNestingDepthExceeded,
}
Expand description
Errors for implementation-defined limits, to mitigate malicious SVG documents.
These get emitted as LoadingError::LimitExceeded
or RenderingError::LimitExceeded
.
The limits are present to mitigate malicious SVG documents which may try to exhaust
all available memory, or which would use large amounts of CPU time.
Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
TooManyReferencedElements
Document exceeded the maximum number of times that elements can be referenced through URL fragments.
This is a mitigation for malicious documents that attempt to
consume exponential amounts of CPU time by creating millions
of references to SVG elements. For example, the <use>
and
<pattern>
elements allow referencing other elements, which
can in turn reference other elements. This can be used to
create documents which would require exponential amounts of
CPU time to be rendered.
Librsvg deals with both cases by placing a limit on how many
references will be resolved during the SVG rendering process,
that is, how many url(#foo)
will be resolved.
These malicious documents are similar to the XML billion laughs attack, but done with SVG’s referencing features.
See issues
#323 and
#515 for
examples for the <use>
and <pattern>
elements,
respectively.
TooManyLoadedElements
Document exceeded the maximum number of elements that can be loaded.
This is a mitigation for SVG files which create millions of elements in an attempt to exhaust memory. Librsvg does not’t allow loading more than a certain number of elements during the initial loading process.
TooManyAttributes
Document exceeded the number of attributes that can be attached to an element.
This is here because librsvg uses u16 to address attributes. It should be essentially impossible to actually hit this limit, because the number of attributes that the SVG standard ascribes meaning to are lower than this limit.
MaximumLayerNestingDepthExceeded
Document exceeded the maximum nesting level while rendering.
Rendering is a recursive process, and there is a limit of how deep layers can nest. This is to avoid malicious SVGs which try to have layers that are nested extremely deep, as this could cause stack exhaustion.
Trait Implementations§
source§impl Clone for ImplementationLimit
impl Clone for ImplementationLimit
source§fn clone(&self) -> ImplementationLimit
fn clone(&self) -> ImplementationLimit
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl Debug for ImplementationLimit
impl Debug for ImplementationLimit
source§impl Display for ImplementationLimit
impl Display for ImplementationLimit
impl Copy for ImplementationLimit
Auto Trait Implementations§
impl Freeze for ImplementationLimit
impl RefUnwindSafe for ImplementationLimit
impl Send for ImplementationLimit
impl Sync for ImplementationLimit
impl Unpin for ImplementationLimit
impl UnwindSafe for ImplementationLimit
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§default unsafe fn clone_to_uninit(&self, dst: *mut T)
default unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)source§impl<T> CloneToUninit for Twhere
T: Copy,
impl<T> CloneToUninit for Twhere
T: Copy,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more§impl<T> Pointable for T
impl<T> Pointable for T
§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self
from the equivalent element of its
superset. Read more§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self
is actually part of its subset T
(and can be converted to it).§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset
but without any property checks. Always succeeds.§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self
to the equivalent element of its superset.