avoid overflows (detected with 'clang -ftrapv')
This commit is contained in:
11
lgc.c
11
lgc.c
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lgc.c,v 2.204 2015/03/04 13:51:55 roberto Exp roberto $
|
** $Id: lgc.c,v 2.205 2015/03/25 13:42:19 roberto Exp roberto $
|
||||||
** Garbage Collector
|
** Garbage Collector
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@@ -1114,9 +1114,12 @@ void luaC_runtilstate (lua_State *L, int statesmask) {
|
|||||||
static l_mem getdebt (global_State *g) {
|
static l_mem getdebt (global_State *g) {
|
||||||
l_mem debt = g->GCdebt;
|
l_mem debt = g->GCdebt;
|
||||||
int stepmul = g->gcstepmul;
|
int stepmul = g->gcstepmul;
|
||||||
debt = (debt / STEPMULADJ) + 1;
|
if (debt <= 0) return 0; /* minimal debt */
|
||||||
debt = (debt < MAX_LMEM / stepmul) ? debt * stepmul : MAX_LMEM;
|
else {
|
||||||
return debt;
|
debt = (debt / STEPMULADJ) + 1;
|
||||||
|
debt = (debt < MAX_LMEM / stepmul) ? debt * stepmul : MAX_LMEM;
|
||||||
|
return debt;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
10
lstate.c
10
lstate.c
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lstate.c,v 2.127 2014/11/02 19:33:33 roberto Exp roberto $
|
** $Id: lstate.c,v 2.128 2015/03/04 13:31:21 roberto Exp roberto $
|
||||||
** Global State
|
** Global State
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@@ -93,10 +93,14 @@ static unsigned int makeseed (lua_State *L) {
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
** set GCdebt to a new value keeping the value (totalbytes + GCdebt)
|
** set GCdebt to a new value keeping the value (totalbytes + GCdebt)
|
||||||
** invariant
|
** invariant (and avoiding underflows in 'totalbytes')
|
||||||
*/
|
*/
|
||||||
void luaE_setdebt (global_State *g, l_mem debt) {
|
void luaE_setdebt (global_State *g, l_mem debt) {
|
||||||
g->totalbytes -= (debt - g->GCdebt);
|
l_mem tb = gettotalbytes(g);
|
||||||
|
lua_assert(tb > 0);
|
||||||
|
if (debt < tb - MAX_LMEM)
|
||||||
|
debt = tb - MAX_LMEM; /* will make 'totalbytes == MAX_LMEM' */
|
||||||
|
g->totalbytes = tb - debt;
|
||||||
g->GCdebt = debt;
|
g->GCdebt = debt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user