Skip to content
This repository was archived by the owner on Jun 1, 2023. It is now read-only.

Commit 6f56a45

Browse files
committed
pp_signature: asan heap-overflows
protect po (the padnl index) from overflowing
1 parent 7654223 commit 6f56a45

File tree

1 file changed

+9
-1
lines changed

1 file changed

+9
-1
lines changed

pp_hot.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5757,8 +5757,9 @@ PP(pp_signature)
57575757
UNOP_AUX_item *items = cUNOP_AUXx(PL_op)->op_aux;
57585758
GV *cvname;
57595759
PADNAME** padnl;
5760-
PADOFFSET po = -1;
57615760
PADNAME* pn = NULL; /* for the type check */
5761+
PADOFFSET po = -1;
5762+
PADOFFSET maxpo;
57625763
int defop_skips; /* how many default op statements to skip */
57635764

57645765
/* check arity (process arg count limits) */
@@ -5774,6 +5775,7 @@ PP(pp_signature)
57745775
const bool hassig = cBOOL(CvHASSIG(cv));
57755776

57765777
padnl = PadlistNAMESARRAY(CvPADLIST(cv));
5778+
maxpo = PadlistNAMESMAX(CvPADLIST(cv));
57775779
/* split on bits [31..16], [15..15], [14..0] */
57785780
mand_params = params >> 16;
57795781
slurpy = cBOOL((params >> 15) & 1);
@@ -5890,6 +5892,8 @@ PP(pp_signature)
58905892
SV **svp = padp = &(PAD_SVl(pad_ix));
58915893

58925894
po = pad_ix;
5895+
if (po > maxpo)
5896+
break;
58935897
pn = padnl[po];
58945898
DEBUG_Xv(Perl_deb(aTHX_ " sigpad padp %p curpad[%lu] %s\n", *padp, po,
58955899
PadnamePV(pn)));
@@ -5947,6 +5951,8 @@ PP(pp_signature)
59475951
if (!varsv) {
59485952
po++;
59495953
argp++;
5954+
if (po > maxpo)
5955+
break;
59505956
pn = padnl[po];
59515957
break;
59525958
}
@@ -6189,6 +6195,8 @@ PP(pp_signature)
61896195

61906196
/* see comments above about unrolled pp_aassign() */
61916197
varsv = *padp++;
6198+
if (po > maxpo)
6199+
break;
61926200
pn = padnl[po++];
61936201
assert(!SvMAGICAL(varsv));
61946202
assert(!HvTOTALKEYS(varsv)); /* can skip hv_clear() */

0 commit comments

Comments
 (0)