@@ -5757,8 +5757,9 @@ PP(pp_signature)
5757
5757
UNOP_AUX_item * items = cUNOP_AUXx (PL_op )-> op_aux ;
5758
5758
GV * cvname ;
5759
5759
PADNAME * * padnl ;
5760
- PADOFFSET po = -1 ;
5761
5760
PADNAME * pn = NULL ; /* for the type check */
5761
+ PADOFFSET po = -1 ;
5762
+ PADOFFSET maxpo ;
5762
5763
int defop_skips ; /* how many default op statements to skip */
5763
5764
5764
5765
/* check arity (process arg count limits) */
@@ -5774,6 +5775,7 @@ PP(pp_signature)
5774
5775
const bool hassig = cBOOL (CvHASSIG (cv ));
5775
5776
5776
5777
padnl = PadlistNAMESARRAY (CvPADLIST (cv ));
5778
+ maxpo = PadlistNAMESMAX (CvPADLIST (cv ));
5777
5779
/* split on bits [31..16], [15..15], [14..0] */
5778
5780
mand_params = params >> 16 ;
5779
5781
slurpy = cBOOL ((params >> 15 ) & 1 );
@@ -5890,6 +5892,8 @@ PP(pp_signature)
5890
5892
SV * * svp = padp = & (PAD_SVl (pad_ix ));
5891
5893
5892
5894
po = pad_ix ;
5895
+ if (po > maxpo )
5896
+ break ;
5893
5897
pn = padnl [po ];
5894
5898
DEBUG_Xv (Perl_deb (aTHX_ " sigpad padp %p curpad[%lu] %s\n" , * padp , po ,
5895
5899
PadnamePV (pn )));
@@ -5947,6 +5951,8 @@ PP(pp_signature)
5947
5951
if (!varsv ) {
5948
5952
po ++ ;
5949
5953
argp ++ ;
5954
+ if (po > maxpo )
5955
+ break ;
5950
5956
pn = padnl [po ];
5951
5957
break ;
5952
5958
}
@@ -6189,6 +6195,8 @@ PP(pp_signature)
6189
6195
6190
6196
/* see comments above about unrolled pp_aassign() */
6191
6197
varsv = * padp ++ ;
6198
+ if (po > maxpo )
6199
+ break ;
6192
6200
pn = padnl [po ++ ];
6193
6201
assert (!SvMAGICAL (varsv ));
6194
6202
assert (!HvTOTALKEYS (varsv )); /* can skip hv_clear() */
0 commit comments