@@ -31,7 +31,7 @@ mod mock;
31
31
#[ cfg( test) ]
32
32
mod tests;
33
33
34
- use codec:: { Decode , Encode } ;
34
+ use codec:: { Decode , DecodeAll , DecodeLimit , Encode } ;
35
35
use cumulus_primitives_core:: {
36
36
relay_chain:: BlockNumber as RelayBlockNumber , ChannelStatus , GetChannelInfo , MessageSendError ,
37
37
ParaId , XcmpMessageFormat , XcmpMessageHandler , XcmpMessageSource ,
@@ -44,7 +44,7 @@ use rand_chacha::{
44
44
use scale_info:: TypeInfo ;
45
45
use sp_runtime:: { traits:: Hash , RuntimeDebug } ;
46
46
use sp_std:: { convert:: TryFrom , prelude:: * } ;
47
- use xcm:: { latest:: prelude:: * , VersionedXcm , WrapVersion } ;
47
+ use xcm:: { latest:: prelude:: * , VersionedXcm , WrapVersion , MAX_XCM_DECODE_DEPTH } ;
48
48
49
49
pub use pallet:: * ;
50
50
@@ -249,7 +249,11 @@ impl<T: Config> Pallet<T> {
249
249
let have_active = s[ index] . 4 > s[ index] . 3 ;
250
250
let appended = have_active &&
251
251
<OutboundXcmpMessages < T > >:: mutate ( recipient, s[ index] . 4 - 1 , |s| {
252
- if XcmpMessageFormat :: decode ( & mut & s[ ..] ) != Ok ( format) {
252
+ if XcmpMessageFormat :: decode_and_advance_with_depth_limit (
253
+ MAX_XCM_DECODE_DEPTH ,
254
+ & mut & s[ ..] ,
255
+ ) != Ok ( format)
256
+ {
253
257
return false
254
258
}
255
259
if s. len ( ) + data. len ( ) > max_message_size {
@@ -371,7 +375,10 @@ impl<T: Config> Pallet<T> {
371
375
XcmpMessageFormat :: ConcatenatedVersionedXcm => {
372
376
while !remaining_fragments. is_empty ( ) {
373
377
last_remaining_fragments = remaining_fragments;
374
- if let Ok ( xcm) = VersionedXcm :: < T :: Call > :: decode ( & mut remaining_fragments) {
378
+ if let Ok ( xcm) = VersionedXcm :: < T :: Call > :: decode_and_advance_with_depth_limit (
379
+ MAX_XCM_DECODE_DEPTH ,
380
+ & mut remaining_fragments,
381
+ ) {
375
382
let weight = max_weight - weight_used;
376
383
match Self :: handle_xcm_message ( sender, sent_at, xcm, weight) {
377
384
Ok ( used) => weight_used = weight_used. saturating_add ( used) ,
@@ -394,7 +401,7 @@ impl<T: Config> Pallet<T> {
394
401
XcmpMessageFormat :: ConcatenatedEncodedBlob => {
395
402
while !remaining_fragments. is_empty ( ) {
396
403
last_remaining_fragments = remaining_fragments;
397
- if let Ok ( blob) = <Vec < u8 > >:: decode ( & mut remaining_fragments) {
404
+ if let Ok ( blob) = <Vec < u8 > >:: decode_all ( & mut remaining_fragments) {
398
405
let weight = max_weight - weight_used;
399
406
match Self :: handle_blob_message ( sender, sent_at, blob, weight) {
400
407
Ok ( used) => weight_used = weight_used. saturating_add ( used) ,
@@ -588,7 +595,10 @@ impl<T: Config> XcmpMessageHandler for Pallet<T> {
588
595
for ( sender, sent_at, data) in iter {
589
596
// Figure out the message format.
590
597
let mut data_ref = data;
591
- let format = match XcmpMessageFormat :: decode ( & mut data_ref) {
598
+ let format = match XcmpMessageFormat :: decode_and_advance_with_depth_limit (
599
+ MAX_XCM_DECODE_DEPTH ,
600
+ & mut data_ref,
601
+ ) {
592
602
Ok ( f) => f,
593
603
Err ( _) => {
594
604
debug_assert ! ( false , "Unknown XCMP message format. Silently dropping message" ) ;
0 commit comments