avoid overflows (detected with 'clang -ftrapv')

This commit is contained in:
Roberto Ierusalimschy
2015-07-13 10:30:03 -03:00
parent 5b6ac971f9
commit 2b61360d82
2 changed files with 14 additions and 7 deletions

11
lgc.c
View File

@@ -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;
}
} }
/* /*

View File

@@ -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;
} }