aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2020-11-08 11:52:26 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2020-11-08 11:52:26 -0300
commitd28265256110a0c5437247d443ddedc2a7aab116 (patch)
treee1aacb5eaa1ef67127aa8206e85eee32d36697be
parent58216600eba27d472de33dbb89e2f3e629bf8a59 (diff)
downloadlua-d28265256110a0c5437247d443ddedc2a7aab116.tar.gz
lua-d28265256110a0c5437247d443ddedc2a7aab116.tar.bz2
lua-d28265256110a0c5437247d443ddedc2a7aab116.zip
Bug when growing a stack
When a stack grows, its extra area can be in use, and it becomes part of the common area. So, the extra area must be kept correct all the times. (Bug introduced by commit 5aa36e894f5.)
-rw-r--r--ldo.c2
-rw-r--r--lgc.c4
-rw-r--r--lstate.c2
3 files changed, 4 insertions, 4 deletions
diff --git a/ldo.c b/ldo.c
index a60972b2..4b55c31c 100644
--- a/ldo.c
+++ b/ldo.c
@@ -192,7 +192,7 @@ int luaD_reallocstack (lua_State *L, int newsize, int raiseerror) {
192 else return 0; /* do not raise an error */ 192 else return 0; /* do not raise an error */
193 } 193 }
194 for (; lim < newsize; lim++) 194 for (; lim < newsize; lim++)
195 setnilvalue(s2v(newstack + lim)); /* erase new segment */ 195 setnilvalue(s2v(newstack + lim + EXTRA_STACK)); /* erase new segment */
196 correctstack(L, L->stack, newstack); 196 correctstack(L, L->stack, newstack);
197 L->stack = newstack; 197 L->stack = newstack;
198 L->stack_last = L->stack + newsize; 198 L->stack_last = L->stack + newsize;
diff --git a/lgc.c b/lgc.c
index 5dba56fc..bab9beb1 100644
--- a/lgc.c
+++ b/lgc.c
@@ -632,8 +632,8 @@ static int traversethread (global_State *g, lua_State *th) {
632 for (uv = th->openupval; uv != NULL; uv = uv->u.open.next) 632 for (uv = th->openupval; uv != NULL; uv = uv->u.open.next)
633 markobject(g, uv); /* open upvalues cannot be collected */ 633 markobject(g, uv); /* open upvalues cannot be collected */
634 if (g->gcstate == GCSatomic) { /* final traversal? */ 634 if (g->gcstate == GCSatomic) { /* final traversal? */
635 for (; o < th->stack_last; o++) /* clear not-marked stack slice */ 635 for (; o < th->stack_last + EXTRA_STACK; o++)
636 setnilvalue(s2v(o)); 636 setnilvalue(s2v(o)); /* clear dead stack slice */
637 /* 'remarkupvals' may have removed thread from 'twups' list */ 637 /* 'remarkupvals' may have removed thread from 'twups' list */
638 if (!isintwups(th) && th->openupval != NULL) { 638 if (!isintwups(th) && th->openupval != NULL) {
639 th->twups = g->twups; /* link it back to the list */ 639 th->twups = g->twups; /* link it back to the list */
diff --git a/lstate.c b/lstate.c
index 42274292..1c7b8791 100644
--- a/lstate.c
+++ b/lstate.c
@@ -181,7 +181,7 @@ static void stack_init (lua_State *L1, lua_State *L) {
181 int i; CallInfo *ci; 181 int i; CallInfo *ci;
182 /* initialize stack array */ 182 /* initialize stack array */
183 L1->stack = luaM_newvector(L, BASIC_STACK_SIZE + EXTRA_STACK, StackValue); 183 L1->stack = luaM_newvector(L, BASIC_STACK_SIZE + EXTRA_STACK, StackValue);
184 for (i = 0; i < BASIC_STACK_SIZE; i++) 184 for (i = 0; i < BASIC_STACK_SIZE + EXTRA_STACK; i++)
185 setnilvalue(s2v(L1->stack + i)); /* erase new stack */ 185 setnilvalue(s2v(L1->stack + i)); /* erase new stack */
186 L1->top = L1->stack; 186 L1->top = L1->stack;
187 L1->stack_last = L1->stack + BASIC_STACK_SIZE; 187 L1->stack_last = L1->stack + BASIC_STACK_SIZE;