diff options
author | Father Chrysostomos <sprout@cpan.org> | 2013-08-24 19:09:59 -0700 |
---|---|---|
committer | Father Chrysostomos <sprout@cpan.org> | 2013-08-25 06:39:28 -0700 |
commit | fc16c3924bd6aa054f21ad5445fecf9b7f39dc36 (patch) | |
tree | a0ac4568d977ef5c9e125c7bae9e6de466d48146 /pp.h | |
parent | e8eb279cb8d8b30256eb8b1957e1dabed28fc4eb (diff) | |
download | perl-fc16c3924bd6aa054f21ad5445fecf9b7f39dc36.tar.gz |
Use SSize_t when extending the stack
(I am referring to what is usually known simply as The Stack.)
This partially fixes #119161.
By casting the argument to int, we can end up truncating/wrapping
it on 64-bit systems, so EXTEND(SP, 2147483648) translates into
EXTEND(SP, -1), which does not extend the stack at all. Then writing
to the stack in code like ()=1..1000000000000 goes past the end of
allocated memory and crashes.
I can’t really write a test for this, since instead of crashing it
will use more memory than I have available (and then I’ll start for-
getting things).
Diffstat (limited to 'pp.h')
-rw-r--r-- | pp.h | 8 |
1 files changed, 4 insertions, 4 deletions
@@ -156,7 +156,7 @@ Pops a long off the stack. /* Go to some pains in the rare event that we must extend the stack. */ /* -=for apidoc Am|void|EXTEND|SP|int nitems +=for apidoc Am|void|EXTEND|SP|SSize_t nitems Used to extend the argument stack for an XSUB's return values. Once used, guarantees that there is room for at least C<nitems> to be pushed onto the stack. @@ -278,13 +278,13 @@ Does not use C<TARG>. See also C<XPUSHu>, C<mPUSHu> and C<PUSHu>. =cut */ -#define EXTEND(p,n) (void)(UNLIKELY(PL_stack_max - p < (int)(n)) && \ - (sp = stack_grow(sp,p, (int) (n)))) +#define EXTEND(p,n) (void)(UNLIKELY(PL_stack_max - p < (SSize_t)(n)) && \ + (sp = stack_grow(sp,p, (SSize_t) (n)))) /* Same thing, but update mark register too. */ #define MEXTEND(p,n) STMT_START {if (UNLIKELY(PL_stack_max - p < (int)(n))) {\ const int markoff = mark - PL_stack_base; \ - sp = stack_grow(sp,p,(int) (n)); \ + sp = stack_grow(sp,p,(SSize_t) (n)); \ mark = PL_stack_base + markoff; \ } } STMT_END |