summaryrefslogtreecommitdiff
path: root/pp.h
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2013-08-24 19:09:59 -0700
committerFather Chrysostomos <sprout@cpan.org>2013-08-25 06:39:28 -0700
commitfc16c3924bd6aa054f21ad5445fecf9b7f39dc36 (patch)
treea0ac4568d977ef5c9e125c7bae9e6de466d48146 /pp.h
parente8eb279cb8d8b30256eb8b1957e1dabed28fc4eb (diff)
downloadperl-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.h8
1 files changed, 4 insertions, 4 deletions
diff --git a/pp.h b/pp.h
index cb6a0668f9..af58a521aa 100644
--- a/pp.h
+++ b/pp.h
@@ -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