diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2020-07-27 12:01:38 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2020-07-27 12:01:38 -0300 |
commit | a585eae6e7ada1ca9271607a4f48dfb17868ab7b (patch) | |
tree | 0f69f927eaa5f94294aef8373185d2f603c5ff51 | |
parent | d2c2e32e8a0f649099de0e9d04b5a72037b7b138 (diff) | |
download | lua-a585eae6e7ada1ca9271607a4f48dfb17868ab7b.tar.gz lua-a585eae6e7ada1ca9271607a4f48dfb17868ab7b.tar.bz2 lua-a585eae6e7ada1ca9271607a4f48dfb17868ab7b.zip |
Fixed bug: Negation overflow in getlocal/setlocal
-rw-r--r-- | ldebug.c | 6 |
1 files changed, 3 insertions, 3 deletions
@@ -188,8 +188,8 @@ static const char *upvalname (const Proto *p, int uv) { | |||
188 | static const char *findvararg (CallInfo *ci, int n, StkId *pos) { | 188 | static const char *findvararg (CallInfo *ci, int n, StkId *pos) { |
189 | if (clLvalue(s2v(ci->func))->p->is_vararg) { | 189 | if (clLvalue(s2v(ci->func))->p->is_vararg) { |
190 | int nextra = ci->u.l.nextraargs; | 190 | int nextra = ci->u.l.nextraargs; |
191 | if (n <= nextra) { | 191 | if (n >= -nextra) { /* 'n' is negative */ |
192 | *pos = ci->func - nextra + (n - 1); | 192 | *pos = ci->func - nextra - (n + 1); |
193 | return "(vararg)"; /* generic name for any vararg */ | 193 | return "(vararg)"; /* generic name for any vararg */ |
194 | } | 194 | } |
195 | } | 195 | } |
@@ -202,7 +202,7 @@ const char *luaG_findlocal (lua_State *L, CallInfo *ci, int n, StkId *pos) { | |||
202 | const char *name = NULL; | 202 | const char *name = NULL; |
203 | if (isLua(ci)) { | 203 | if (isLua(ci)) { |
204 | if (n < 0) /* access to vararg values? */ | 204 | if (n < 0) /* access to vararg values? */ |
205 | return findvararg(ci, -n, pos); | 205 | return findvararg(ci, n, pos); |
206 | else | 206 | else |
207 | name = luaF_getlocalname(ci_func(ci)->p, n, currentpc(ci)); | 207 | name = luaF_getlocalname(ci_func(ci)->p, n, currentpc(ci)); |
208 | } | 208 | } |