diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2008-04-07 15:44:23 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2008-04-07 15:44:23 -0300 |
| commit | facb0519a08faec540f81aee045c8e1dbb7e6aed (patch) | |
| tree | eb897bfa47a0d778faef84c1afe2a00c45588edf | |
| parent | ffdca3522e757f0203b7bdbe5bccb0ae826bfd81 (diff) | |
| download | lua-facb0519a08faec540f81aee045c8e1dbb7e6aed.tar.gz lua-facb0519a08faec540f81aee045c8e1dbb7e6aed.tar.bz2 lua-facb0519a08faec540f81aee045c8e1dbb7e6aed.zip | |
two bugs: invalid boolean values in constant table + too deep recursion
when reading nested functions
| -rw-r--r-- | lundump.c | 9 |
1 files changed, 6 insertions, 3 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lundump.c,v 2.7 2006/02/17 15:51:03 roberto Exp roberto $ | 2 | ** $Id: lundump.c,v 2.8 2006/09/11 14:07:24 roberto Exp roberto $ |
| 3 | ** load precompiled Lua chunks | 3 | ** load precompiled Lua chunks |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -113,7 +113,7 @@ static void LoadConstants(LoadState* S, Proto* f) | |||
| 113 | setnilvalue(o); | 113 | setnilvalue(o); |
| 114 | break; | 114 | break; |
| 115 | case LUA_TBOOLEAN: | 115 | case LUA_TBOOLEAN: |
| 116 | setbvalue(o,LoadChar(S)); | 116 | setbvalue(o,LoadChar(S)!=0); |
| 117 | break; | 117 | break; |
| 118 | case LUA_TNUMBER: | 118 | case LUA_TNUMBER: |
| 119 | setnvalue(o,LoadNumber(S)); | 119 | setnvalue(o,LoadNumber(S)); |
| @@ -159,7 +159,9 @@ static void LoadDebug(LoadState* S, Proto* f) | |||
| 159 | 159 | ||
| 160 | static Proto* LoadFunction(LoadState* S, TString* p) | 160 | static Proto* LoadFunction(LoadState* S, TString* p) |
| 161 | { | 161 | { |
| 162 | Proto* f=luaF_newproto(S->L); | 162 | Proto* f; |
| 163 | if (++G(S->L)->nCcalls > LUAI_MAXCCALLS) error(S, "function nest too deep"); | ||
| 164 | f=luaF_newproto(S->L); | ||
| 163 | setptvalue2s(S->L,S->L->top,f); incr_top(S->L); | 165 | setptvalue2s(S->L,S->L->top,f); incr_top(S->L); |
| 164 | f->source=LoadString(S); if (f->source==NULL) f->source=p; | 166 | f->source=LoadString(S); if (f->source==NULL) f->source=p; |
| 165 | f->linedefined=LoadInt(S); | 167 | f->linedefined=LoadInt(S); |
| @@ -173,6 +175,7 @@ static Proto* LoadFunction(LoadState* S, TString* p) | |||
| 173 | LoadDebug(S,f); | 175 | LoadDebug(S,f); |
| 174 | IF (!luaG_checkcode(f), "bad code"); | 176 | IF (!luaG_checkcode(f), "bad code"); |
| 175 | S->L->top--; | 177 | S->L->top--; |
| 178 | G(S->L)->nCcalls--; | ||
| 176 | return f; | 179 | return f; |
| 177 | } | 180 | } |
| 178 | 181 | ||
