diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2015-02-19 15:05:13 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2015-02-19 15:05:13 -0200 |
commit | abd8f8433dc6628add06b1aa3568d40c1fdd9c46 (patch) | |
tree | ab803d7df4d59d90224b666662e5a9749b8a4754 | |
parent | ce74637ace147d147578a95c435cf7cafec590b8 (diff) | |
download | lua-abd8f8433dc6628add06b1aa3568d40c1fdd9c46.tar.gz lua-abd8f8433dc6628add06b1aa3568d40c1fdd9c46.tar.bz2 lua-abd8f8433dc6628add06b1aa3568d40c1fdd9c46.zip |
bug: suspended function can have its 'func' field not pointing to
its function, crashing debug functions
-rw-r--r-- | ldebug.c | 21 |
1 files changed, 19 insertions, 2 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ldebug.c,v 2.90.1.2 2013/05/06 17:20:22 roberto Exp roberto $ | 2 | ** $Id: ldebug.c,v 2.90.1.3 2013/05/16 16:04:15 roberto Exp roberto $ |
3 | ** Debug Interface | 3 | ** Debug Interface |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -47,6 +47,16 @@ static int currentline (CallInfo *ci) { | |||
47 | } | 47 | } |
48 | 48 | ||
49 | 49 | ||
50 | static void swapextra (lua_State *L) { | ||
51 | if (L->status == LUA_YIELD) { | ||
52 | CallInfo *ci = L->ci; /* get function that yielded */ | ||
53 | StkId temp = ci->func; /* exchange its 'func' and 'extra' values */ | ||
54 | ci->func = restorestack(L, ci->extra); | ||
55 | ci->extra = savestack(L, temp); | ||
56 | } | ||
57 | } | ||
58 | |||
59 | |||
50 | /* | 60 | /* |
51 | ** this function can be called asynchronous (e.g. during a signal) | 61 | ** this function can be called asynchronous (e.g. during a signal) |
52 | */ | 62 | */ |
@@ -144,6 +154,7 @@ static const char *findlocal (lua_State *L, CallInfo *ci, int n, | |||
144 | LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) { | 154 | LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) { |
145 | const char *name; | 155 | const char *name; |
146 | lua_lock(L); | 156 | lua_lock(L); |
157 | swapextra(L); | ||
147 | if (ar == NULL) { /* information about non-active function? */ | 158 | if (ar == NULL) { /* information about non-active function? */ |
148 | if (!isLfunction(L->top - 1)) /* not a Lua function? */ | 159 | if (!isLfunction(L->top - 1)) /* not a Lua function? */ |
149 | name = NULL; | 160 | name = NULL; |
@@ -158,6 +169,7 @@ LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) { | |||
158 | api_incr_top(L); | 169 | api_incr_top(L); |
159 | } | 170 | } |
160 | } | 171 | } |
172 | swapextra(L); | ||
161 | lua_unlock(L); | 173 | lua_unlock(L); |
162 | return name; | 174 | return name; |
163 | } | 175 | } |
@@ -165,11 +177,14 @@ LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) { | |||
165 | 177 | ||
166 | LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) { | 178 | LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) { |
167 | StkId pos = 0; /* to avoid warnings */ | 179 | StkId pos = 0; /* to avoid warnings */ |
168 | const char *name = findlocal(L, ar->i_ci, n, &pos); | 180 | const char *name; |
169 | lua_lock(L); | 181 | lua_lock(L); |
182 | swapextra(L); | ||
183 | name = findlocal(L, ar->i_ci, n, &pos); | ||
170 | if (name) | 184 | if (name) |
171 | setobjs2s(L, pos, L->top - 1); | 185 | setobjs2s(L, pos, L->top - 1); |
172 | L->top--; /* pop value */ | 186 | L->top--; /* pop value */ |
187 | swapextra(L); | ||
173 | lua_unlock(L); | 188 | lua_unlock(L); |
174 | return name; | 189 | return name; |
175 | } | 190 | } |
@@ -269,6 +284,7 @@ LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) { | |||
269 | CallInfo *ci; | 284 | CallInfo *ci; |
270 | StkId func; | 285 | StkId func; |
271 | lua_lock(L); | 286 | lua_lock(L); |
287 | swapextra(L); | ||
272 | if (*what == '>') { | 288 | if (*what == '>') { |
273 | ci = NULL; | 289 | ci = NULL; |
274 | func = L->top - 1; | 290 | func = L->top - 1; |
@@ -287,6 +303,7 @@ LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) { | |||
287 | setobjs2s(L, L->top, func); | 303 | setobjs2s(L, L->top, func); |
288 | api_incr_top(L); | 304 | api_incr_top(L); |
289 | } | 305 | } |
306 | swapextra(L); | ||
290 | if (strchr(what, 'L')) | 307 | if (strchr(what, 'L')) |
291 | collectvalidlines(L, cl); | 308 | collectvalidlines(L, cl); |
292 | lua_unlock(L); | 309 | lua_unlock(L); |