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 /lundump.c | |
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
Diffstat (limited to 'lundump.c')
-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 | ||