aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2019-07-19 12:13:00 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2019-07-19 12:13:00 -0300
commit440a5ee78c8592230780310c9c8d8c2ba1700cb1 (patch)
tree30d361cbe23eb652f8874e580750ca65fcca5b52 /lvm.c
parentdc07719b0dbc4f2df0f42e34e18be1e0ac4fa2c3 (diff)
downloadlua-440a5ee78c8592230780310c9c8d8c2ba1700cb1.tar.gz
lua-440a5ee78c8592230780310c9c8d8c2ba1700cb1.tar.bz2
lua-440a5ee78c8592230780310c9c8d8c2ba1700cb1.zip
Fixed bug for emergency collection in upvalue creation
When creating an upvalue, an emergency collection can collect the previous upvalue where the new one would be linked. The following code can trigger the bug, using valgrind on Lua compiled with the -DHARDMEMTESTS option: local x; local y (function () return y end)(); (function () return x end)()
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/lvm.c b/lvm.c
index d9bd0ab3..d3e05199 100644
--- a/lvm.c
+++ b/lvm.c
@@ -697,7 +697,7 @@ static void pushclosure (lua_State *L, Proto *p, UpVal **encup, StkId base,
697 setclLvalue2s(L, ra, ncl); /* anchor new closure in stack */ 697 setclLvalue2s(L, ra, ncl); /* anchor new closure in stack */
698 for (i = 0; i < nup; i++) { /* fill in its upvalues */ 698 for (i = 0; i < nup; i++) { /* fill in its upvalues */
699 if (uv[i].instack) /* upvalue refers to local variable? */ 699 if (uv[i].instack) /* upvalue refers to local variable? */
700 ncl->upvals[i] = luaF_findupval(L, base + uv[i].idx); 700 luaF_setupval(L, base + uv[i].idx, &ncl->upvals[i]);
701 else /* get upvalue from enclosing function */ 701 else /* get upvalue from enclosing function */
702 ncl->upvals[i] = encup[uv[i].idx]; 702 ncl->upvals[i] = encup[uv[i].idx];
703 luaC_objbarrier(L, ncl, ncl->upvals[i]); 703 luaC_objbarrier(L, ncl, ncl->upvals[i]);