summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTony Cook <tony@develop-help.com>2017-08-23 14:18:26 +1000
committerSteve Hay <steve.m.hay@googlemail.com>2019-04-02 12:17:39 +0100
commit068de6b3983d5339e978256cf8476ef3d0add41f (patch)
tree798a4094d05c425179d2aec2bc094edb1b1fa783
parent99b39506d91c9659ff8a1a995cc7cd769158a296 (diff)
downloadperl-068de6b3983d5339e978256cf8476ef3d0add41f.tar.gz
(perl #131562) correct large line numbers copying eval lines on #line
Previously this used I32 for line numbers, which takes half the range of line_t and folds it into negative numbers, leading to trying to store the lines at negative indexes. The while loop was also modified to stop storing if/when the line number no longer fits into cop_line, or no longer fits into SSize_t (as a positive number) since the index parameter to av_store() is a SSize_t. (cherry picked from commit 515c395bcca24c55c85b5aeea239e5e836c36059)
-rw-r--r--toke.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/toke.c b/toke.c
index f614df504e..622873dca3 100644
--- a/toke.c
+++ b/toke.c
@@ -1829,14 +1829,14 @@ S_incline(pTHX_ const char *s, const char *end)
}
else if (GvAV(cfgv)) {
AV * const av = GvAV(cfgv);
- const I32 start = CopLINE(PL_curcop)+1;
- I32 items = AvFILLp(av) - start;
+ const line_t start = CopLINE(PL_curcop)+1;
+ SSize_t items = AvFILLp(av) - start;
if (items > 0) {
AV * const av2 = GvAVn(gv2);
SV **svp = AvARRAY(av) + start;
- I32 l = (I32)line_num+1;
- while (items--)
- av_store(av2, l++, SvREFCNT_inc(*svp++));
+ Size_t l = line_num+1;
+ while (items-- && l < SSize_t_MAX && l == (line_t)l)
+ av_store(av2, (SSize_t)l++, SvREFCNT_inc(*svp++));
}
}
}