mirror of https://github.com/rusefi/lua.git
stack overflow in vararg functions + garbage collector in recursive loops
This commit is contained in:
parent
67532d5a10
commit
6347004be9
77
bugs
77
bugs
|
@ -179,13 +179,13 @@ Tue May 2 15:27:58 EST 2000
|
||||||
** lparser.c
|
** lparser.c
|
||||||
Fri May 12 15:11:12 EST 2000
|
Fri May 12 15:11:12 EST 2000
|
||||||
>> first element in a list constructor is not adjusted to one value
|
>> first element in a list constructor is not adjusted to one value
|
||||||
>> (e.g. «a = {gsub('a','a','')}»)
|
>> (e.g. «a = {gsub('a','a','')}»)
|
||||||
(by Tomas; since 4.0a)
|
(by Tomas; since 4.0a)
|
||||||
|
|
||||||
** lparser.c
|
** lparser.c
|
||||||
Wed May 24 14:50:16 EST 2000
|
Wed May 24 14:50:16 EST 2000
|
||||||
>> record-constructor starting with an upvalue name gets an error
|
>> record-constructor starting with an upvalue name gets an error
|
||||||
>> (e.g. «local a; function f() x = {a=1} end»)
|
>> (e.g. «local a; function f() x = {a=1} end»)
|
||||||
(by Edgar Toernig; since 3.1)
|
(by Edgar Toernig; since 3.1)
|
||||||
|
|
||||||
** lparser.c
|
** lparser.c
|
||||||
|
@ -226,7 +226,7 @@ Wed Sep 27 09:50:19 EST 2000
|
||||||
** llex.h / llex.c / lparser.c
|
** llex.h / llex.c / lparser.c
|
||||||
Wed Sep 27 13:39:45 EST 2000
|
Wed Sep 27 13:39:45 EST 2000
|
||||||
>> parser overwrites semantic information when looking ahead
|
>> parser overwrites semantic information when looking ahead
|
||||||
>> (e.g. «a = {print'foo'}»)
|
>> (e.g. «a = {print'foo'}»)
|
||||||
(by Edgar Toernig; since 4.0b, deriving from previous bug)
|
(by Edgar Toernig; since 4.0b, deriving from previous bug)
|
||||||
|
|
||||||
** liolib.c
|
** liolib.c
|
||||||
|
@ -257,7 +257,7 @@ Thu Feb 1 11:55:45 EDT 2001
|
||||||
|
|
||||||
** ldo.c
|
** ldo.c
|
||||||
Fri Feb 2 14:06:40 EDT 2001
|
Fri Feb 2 14:06:40 EDT 2001
|
||||||
>> «while 1 dostring[[print('hello\n')]] end» never reclaims memory
|
>> «while 1 dostring[[print('hello\n')]] end» never reclaims memory
|
||||||
(by Andrew Paton; since 4.0b)
|
(by Andrew Paton; since 4.0b)
|
||||||
|
|
||||||
** lbaselib.c
|
** lbaselib.c
|
||||||
|
@ -1375,7 +1375,7 @@ patch = [[
|
||||||
Bug{
|
Bug{
|
||||||
what = [[As a library, loadlib.c should not access Lua internals
|
what = [[As a library, loadlib.c should not access Lua internals
|
||||||
(via lobject.h)]],
|
(via lobject.h)]],
|
||||||
report = [[Jérôme Vuarand, on 03/2007]],
|
report = [[Jérôme Vuarand, on 03/2007]],
|
||||||
since = [[5.0]],
|
since = [[5.0]],
|
||||||
example = [[the bug has no effect on external behavior]],
|
example = [[the bug has no effect on external behavior]],
|
||||||
patch = [[remove the '#include "lobject.h" and use
|
patch = [[remove the '#include "lobject.h" and use
|
||||||
|
@ -1880,8 +1880,8 @@ patch = [[
|
||||||
+++ lundump.c 2008/04/04 19:51:41 2.7.1.4
|
+++ lundump.c 2008/04/04 19:51:41 2.7.1.4
|
||||||
@@ -1,5 +1,5 @@
|
@@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
-** $Id: bugs,v 1.119 2012/12/03 20:18:02 roberto Exp roberto $
|
-** $Id: bugs,v 1.120 2013/02/07 15:57:47 roberto Exp roberto $
|
||||||
+** $Id: bugs,v 1.119 2012/12/03 20:18:02 roberto Exp roberto $
|
+** $Id: bugs,v 1.120 2013/02/07 15:57:47 roberto Exp roberto $
|
||||||
** load precompiled Lua chunks
|
** load precompiled Lua chunks
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -2854,6 +2854,69 @@ patch = [[
|
||||||
]]
|
]]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Bug{
|
||||||
|
what = [[stack overflow in vararg functions with many fixed
|
||||||
|
parameters called with few arguments]],
|
||||||
|
report = [[云风, 2013/04/17]],
|
||||||
|
since = [[5.1]],
|
||||||
|
fix = nil,
|
||||||
|
example = [[
|
||||||
|
function f(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10,
|
||||||
|
p11, p12, p13, p14, p15, p16, p17, p18, p19, p20,
|
||||||
|
p21, p22, p23, p24, p25, p26, p27, p28, p29, p30,
|
||||||
|
p31, p32, p33, p34, p35, p36, p37, p38, p39, p40,
|
||||||
|
p41, p42, p43, p44, p45, p46, p48, p49, p50, ...)
|
||||||
|
local a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14
|
||||||
|
end
|
||||||
|
|
||||||
|
f() -- seg. fault (on some machines)
|
||||||
|
]],
|
||||||
|
patch = [[
|
||||||
|
--- ldo.c 2012/10/01 14:05:04 2.108
|
||||||
|
+++ ldo.c 2013/04/19 20:56:06
|
||||||
|
@@ -324,7 +324,7 @@
|
||||||
|
case LUA_TLCL: { /* Lua function: prepare its call */
|
||||||
|
StkId base;
|
||||||
|
Proto *p = clLvalue(func)->p;
|
||||||
|
- luaD_checkstack(L, p->maxstacksize);
|
||||||
|
+ luaD_checkstack(L, p->maxstacksize + p->numparams);
|
||||||
|
func = restorestack(L, funcr);
|
||||||
|
n = cast_int(L->top - func) - 1; /* number of real arguments */
|
||||||
|
for (; n < p->numparams; n++)
|
||||||
|
]],
|
||||||
|
}
|
||||||
|
|
||||||
|
--[=[
|
||||||
|
Bug{
|
||||||
|
what = [[garbage collector can trigger too many times in recursive loops]],
|
||||||
|
report = [[Roberto, 2013/04/25]],
|
||||||
|
since = [[5.2.2]],
|
||||||
|
fix = nil,
|
||||||
|
example = [[
|
||||||
|
function f() f() end
|
||||||
|
f() -- it takes too long before a "stack overflow" error
|
||||||
|
]],
|
||||||
|
patch = [[
|
||||||
|
--- lgc.c 2013/04/12 18:48:47 2.140.1.1
|
||||||
|
+++ lgc.c 2013/04/25 21:30:20
|
||||||
|
@@ -495,2 +495,3 @@
|
||||||
|
static lu_mem traversestack (global_State *g, lua_State *th) {
|
||||||
|
+ int n = 0;
|
||||||
|
StkId o = th->stack;
|
||||||
|
@@ -505,3 +506,9 @@
|
||||||
|
}
|
||||||
|
- return sizeof(lua_State) + sizeof(TValue) * th->stacksize;
|
||||||
|
+ else { /* count call infos to compute size */
|
||||||
|
+ CallInfo *ci;
|
||||||
|
+ for (ci = &th->base_ci; ci != th->ci; ci = ci->next)
|
||||||
|
+ n++;
|
||||||
|
+ }
|
||||||
|
+ return sizeof(lua_State) + sizeof(TValue) * th->stacksize +
|
||||||
|
+ sizeof(CallInfo) * n;
|
||||||
|
}
|
||||||
|
]]
|
||||||
|
}
|
||||||
|
|
||||||
--[=[
|
--[=[
|
||||||
Bug{
|
Bug{
|
||||||
what = [[ ]],
|
what = [[ ]],
|
||||||
|
|
Loading…
Reference in New Issue