Accepting request 827293 from home:gmbr3:Lua
- Add upstream patches 9,10,11,12 * Patch 9: CVE-2020-24342, boo#1175339 OBS-URL: https://build.opensuse.org/request/show/827293 OBS-URL: https://build.opensuse.org/package/show/devel:languages:lua/lua54?expand=0&rev=9
This commit is contained in:
parent
ee0ec2d5c6
commit
aacf68ffaf
@ -1,3 +1,9 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Aug 17 10:00:04 UTC 2020 - Callum Farmer <callumjfarmer13@gmail.com>
|
||||||
|
|
||||||
|
- Add upstream patches 9,10,11,12
|
||||||
|
* Patch 9: CVE-2020-24342, boo#1175339
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Mon Jul 20 11:00:56 UTC 2020 - Callum Farmer <callumjfarmer13@gmail.com>
|
Mon Jul 20 11:00:56 UTC 2020 - Callum Farmer <callumjfarmer13@gmail.com>
|
||||||
|
|
||||||
|
@ -1,5 +1,27 @@
|
|||||||
--- a/src/lgc.c
|
--- a/src/lgc.c
|
||||||
+++ b/src/lgc.c
|
+++ b/src/lgc.c
|
||||||
|
@@ -202,7 +205,8 @@ void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v) {
|
||||||
|
}
|
||||||
|
else { /* sweep phase */
|
||||||
|
lua_assert(issweepphase(g));
|
||||||
|
- makewhite(g, o); /* mark main obj. as white to avoid other barriers */
|
||||||
|
+ if (g->gckind == KGC_INC) /* incremental mode? */
|
||||||
|
+ makewhite(g, o); /* mark 'o' as white to avoid other barriers */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -340,9 +349,11 @@ static int remarkupvals (global_State *g) {
|
||||||
|
p = &thread->twups; /* keep marked thread with upvalues in the list */
|
||||||
|
else { /* thread is not marked or without upvalues */
|
||||||
|
UpVal *uv;
|
||||||
|
+ lua_assert(!isold(thread) || thread->openupval == NULL);
|
||||||
|
*p = thread->twups; /* remove thread from the list */
|
||||||
|
thread->twups = thread; /* mark that it is out of list */
|
||||||
|
for (uv = thread->openupval; uv != NULL; uv = uv->u.open.next) {
|
||||||
|
+ lua_assert(getage(uv) <= getage(thread));
|
||||||
|
work++;
|
||||||
|
if (!iswhite(uv)) /* upvalue already visited? */
|
||||||
|
markvalue(g, uv->v); /* mark its value */
|
||||||
@@ -856,6 +856,8 @@ static void GCTM (lua_State *L) {
|
@@ -856,6 +856,8 @@ static void GCTM (lua_State *L) {
|
||||||
if (unlikely(status != LUA_OK)) { /* error while running __gc? */
|
if (unlikely(status != LUA_OK)) { /* error while running __gc? */
|
||||||
luaE_warnerror(L, "__gc metamethod");
|
luaE_warnerror(L, "__gc metamethod");
|
||||||
@ -18,6 +40,22 @@
|
|||||||
markold(g, g->finobj, g->finobjrold);
|
markold(g, g->finobj, g->finobjrold);
|
||||||
atomic(L);
|
atomic(L);
|
||||||
|
|
||||||
|
@@ -1143,6 +1157,7 @@ static void youngcollection (lua_State *L, global_State *g) {
|
||||||
|
atomic(L);
|
||||||
|
|
||||||
|
/* sweep nursery and get a pointer to its last live element */
|
||||||
|
+ g->gcstate = GCSswpallgc;
|
||||||
|
psurvival = sweepgen(L, g, &g->allgc, g->survival);
|
||||||
|
/* sweep 'survival' and 'old' */
|
||||||
|
sweepgen(L, g, psurvival, g->reallyold);
|
||||||
|
@@ -1166,6 +1181,7 @@ static void youngcollection (lua_State *L, global_State *g) {
|
||||||
|
|
||||||
|
static void atomic2gen (lua_State *L, global_State *g) {
|
||||||
|
/* sweep all elements making them old */
|
||||||
|
+ g->gcstate = GCSswpallgc;
|
||||||
|
sweep2old(L, &g->allgc);
|
||||||
|
/* everything alive now is old */
|
||||||
|
g->reallyold = g->old = g->survival = g->allgc;
|
||||||
--- a/src/ldo.c
|
--- a/src/ldo.c
|
||||||
+++ b/src/ldo.c
|
+++ b/src/ldo.c
|
||||||
@@ -466,13 +466,13 @@ void luaD_call (lua_State *L, StkId func, int nresults) {
|
@@ -466,13 +466,13 @@ void luaD_call (lua_State *L, StkId func, int nresults) {
|
||||||
@ -57,6 +95,25 @@
|
|||||||
for (; narg < nfixparams; narg++)
|
for (; narg < nfixparams; narg++)
|
||||||
setnilvalue(s2v(L->top++)); /* complete missing arguments */
|
setnilvalue(s2v(L->top++)); /* complete missing arguments */
|
||||||
lua_assert(ci->top <= L->stack_last);
|
lua_assert(ci->top <= L->stack_last);
|
||||||
|
@@ -515,14 +515,13 @@ void luaD_call (lua_State *L, StkId func, int nresults) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Similar to 'luaD_call', but does not allow yields during the call.
|
||||||
|
-** If there is a stack overflow, freeing all CI structures will
|
||||||
|
-** force the subsequent call to invoke 'luaE_extendCI', which then
|
||||||
|
-** will raise any errors.
|
||||||
|
*/
|
||||||
|
void luaD_callnoyield (lua_State *L, StkId func, int nResults) {
|
||||||
|
incXCcalls(L);
|
||||||
|
- if (getCcalls(L) <= CSTACKERR) /* possible stack overflow? */
|
||||||
|
- luaE_freeCI(L);
|
||||||
|
+ if (getCcalls(L) <= CSTACKERR) { /* possible C stack overflow? */
|
||||||
|
+ luaE_exitCcall(L); /* to compensate decrement in next call */
|
||||||
|
+ luaE_enterCcall(L); /* check properly */
|
||||||
|
+ }
|
||||||
|
luaD_call(L, func, nResults);
|
||||||
|
decXCcalls(L);
|
||||||
|
}
|
||||||
@@ -674,7 +674,7 @@ LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs,
|
@@ -674,7 +674,7 @@ LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs,
|
||||||
if (from == NULL)
|
if (from == NULL)
|
||||||
L->nCcalls = CSTACKTHREAD;
|
L->nCcalls = CSTACKTHREAD;
|
||||||
@ -112,6 +169,43 @@
|
|||||||
p->closef = &io_pclose;
|
p->closef = &io_pclose;
|
||||||
return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1;
|
return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1;
|
||||||
|
|
||||||
|
--- a/src/ldebug.c
|
||||||
|
+++ b/src/ldebug.c
|
||||||
|
@@ -188,8 +188,8 @@ static const char *upvalname (const Proto *p, int uv) {
|
||||||
|
static const char *findvararg (CallInfo *ci, int n, StkId *pos) {
|
||||||
|
if (clLvalue(s2v(ci->func))->p->is_vararg) {
|
||||||
|
int nextra = ci->u.l.nextraargs;
|
||||||
|
- if (n <= nextra) {
|
||||||
|
- *pos = ci->func - nextra + (n - 1);
|
||||||
|
+ if (n >= -nextra) { /* 'n' is negative */
|
||||||
|
+ *pos = ci->func - nextra - (n + 1);
|
||||||
|
return "(vararg)"; /* generic name for any vararg */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -202,7 +202,7 @@ const char *luaG_findlocal (lua_State *L, CallInfo *ci, int n, StkId *pos) {
|
||||||
|
const char *name = NULL;
|
||||||
|
if (isLua(ci)) {
|
||||||
|
if (n < 0) /* access to vararg values? */
|
||||||
|
- return findvararg(ci, -n, pos);
|
||||||
|
+ return findvararg(ci, n, pos);
|
||||||
|
else
|
||||||
|
name = luaF_getlocalname(ci_func(ci)->p, n, currentpc(ci));
|
||||||
|
}
|
||||||
|
@@ -783,11 +783,13 @@ l_noret luaG_runerror (lua_State *L, const char *fmt, ...) {
|
||||||
|
** previous instruction 'oldpc'.
|
||||||
|
*/
|
||||||
|
static int changedline (const Proto *p, int oldpc, int newpc) {
|
||||||
|
+ if (p->lineinfo == NULL) /* no debug information? */
|
||||||
|
+ return 0;
|
||||||
|
while (oldpc++ < newpc) {
|
||||||
|
if (p->lineinfo[oldpc] != 0)
|
||||||
|
return (luaG_getfuncline(p, oldpc - 1) != luaG_getfuncline(p, newpc));
|
||||||
|
}
|
||||||
|
- return 0; /* no line changes in the way */
|
||||||
|
+ return 0; /* no line changes between positions */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
--- a/src/ldo.h
|
--- a/src/ldo.h
|
||||||
+++ b/src/ldo.h
|
+++ b/src/ldo.h
|
||||||
@@ -44,7 +44,7 @@
|
@@ -44,7 +44,7 @@
|
||||||
|
Loading…
Reference in New Issue
Block a user