Unverified Commit 9d92e7c5 authored by Shawn Tabrizi's avatar Shawn Tabrizi Committed by GitHub
Browse files

Add XCM Decode Limit (#3273)

* Add XCM Decode Limit of 256

* use `decode_all_*`

* Update xcm/src/double_encoded.rs
parent ce4d4a9a
Pipeline #142843 passed with stages
in 37 minutes and 56 seconds
......@@ -15,7 +15,10 @@
// along with Polkadot. If not, see <http://www.gnu.org/licenses/>.
use alloc::vec::Vec;
use parity_scale_codec::{Encode, Decode};
use parity_scale_codec::{Encode, Decode, DecodeLimit};
/// Maximum nesting level for XCM decoding.
pub const MAX_XCM_DECODE_DEPTH: u32 = 8;
/// Wrapper around the encoded and decoded versions of a value.
/// Caches the decoded value once computed.
......@@ -69,14 +72,22 @@ impl<T: Decode> DoubleEncoded<T> {
/// Returns a reference to the value in case of success and `Err(())` in case the decoding fails.
pub fn ensure_decoded(&mut self) -> Result<&T, ()> {
if self.decoded.is_none() {
self.decoded = T::decode(&mut &self.encoded[..]).ok();
self.decoded = T::decode_all_with_depth_limit(
&mut &self.encoded[..],
/// Move the decoded value out or (if not present) decode `encoded`.
pub fn take_decoded(&mut self) -> Result<T, ()> {
self.decoded.take().or_else(|| T::decode(&mut &self.encoded[..]).ok()).ok_or(())
self.decoded.take().or_else(|| {
&mut &self.encoded[..],
/// Provides an API similar to `TryInto` that allows fallible conversion to the inner value type.
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment