@@ -23,6 +23,7 @@ use elements::{self, opcodes, script};
23
23
use { ElementsSig , ToPublicKey } ;
24
24
25
25
use super :: { verify_sersig, Error , HashLockType , SatisfiedConstraint } ;
26
+ use miniscript:: limits:: { MAX_SCRIPT_ELEMENT_SIZE , MAX_STANDARD_P2WSH_STACK_ITEM_SIZE } ;
26
27
use util;
27
28
/// Definition of Stack Element of the Stack used for interpretation of Miniscript.
28
29
/// All stack elements with vec![] go to Dissatisfied and vec![1] are marked to Satisfied.
@@ -431,21 +432,23 @@ impl<'txin> Stack<'txin> {
431
432
if let Err ( e) = hash_outputs. try_push ( ) {
432
433
return Some ( Err ( e) ) ;
433
434
}
435
+ // Maximum number of suffix elements
436
+ let max_elems = MAX_SCRIPT_ELEMENT_SIZE / MAX_STANDARD_P2WSH_STACK_ITEM_SIZE + 1 ;
434
437
let hash_outputs = hash_outputs. as_push ( ) ;
435
438
if hash_outputs. len ( ) == 32 {
436
439
// We want to cat the last 6 elements(5 cats) in suffix
437
- if self . len ( ) < 6 {
440
+ if self . len ( ) < max_elems {
438
441
return Some ( Err ( Error :: UnexpectedStackEnd ) ) ;
439
442
}
440
443
let mut outputs_builder = Vec :: new ( ) ;
441
444
outputs_builder. extend ( pref) ;
442
445
let len = self . len ( ) ;
443
- // Add the 6 suffix elements
444
- for i in 0 ..6 {
445
- outputs_builder. extend ( self [ len - 6 + i] . into_slice ( ) ) ;
446
+ // Add the max_elems suffix elements
447
+ for i in 0 ..max_elems {
448
+ outputs_builder. extend ( self [ len - max_elems + i] . into_slice ( ) ) ;
446
449
}
447
- // Pop the 6 suffix elements
448
- for _ in 0 ..6 {
450
+ // Pop the max_elems suffix elements
451
+ for _ in 0 ..max_elems {
449
452
self . pop ( ) . unwrap ( ) ;
450
453
}
451
454
if sha256d:: Hash :: hash ( & outputs_builder) . as_inner ( ) == hash_outputs {
0 commit comments