diff options
| author | Mike Pall <mike> | 2025-10-16 13:11:02 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2025-10-16 13:11:02 +0200 |
| commit | 54a162688ed25902122077149df9b456bc5a763e (patch) | |
| tree | 5806f7ed867c6a89e0f4522157fd74d5a56a1232 /src | |
| parent | 871db2c84ecefd70a850e03a6c340214a81739f0 (diff) | |
| download | luajit-54a162688ed25902122077149df9b456bc5a763e.tar.gz luajit-54a162688ed25902122077149df9b456bc5a763e.tar.bz2 luajit-54a162688ed25902122077149df9b456bc5a763e.zip | |
Fix reporting of an error during error handling.
Reported by Sergey Kaplun. #1381
Diffstat (limited to 'src')
| -rw-r--r-- | src/lj_err.c | 10 | ||||
| -rw-r--r-- | src/lj_state.c | 1 |
2 files changed, 11 insertions, 0 deletions
diff --git a/src/lj_err.c b/src/lj_err.c index 03b5030b..e8e18758 100644 --- a/src/lj_err.c +++ b/src/lj_err.c | |||
| @@ -803,9 +803,17 @@ LJ_NOINLINE GCstr *lj_err_str(lua_State *L, ErrMsg em) | |||
| 803 | return lj_str_newz(L, err2msg(em)); | 803 | return lj_str_newz(L, err2msg(em)); |
| 804 | } | 804 | } |
| 805 | 805 | ||
| 806 | LJ_NORET LJ_NOINLINE static void lj_err_err(lua_State *L) | ||
| 807 | { | ||
| 808 | setstrV(L, L->top++, lj_err_str(L, LJ_ERR_ERRERR)); | ||
| 809 | lj_err_throw(L, LUA_ERRERR); | ||
| 810 | } | ||
| 811 | |||
| 806 | /* Out-of-memory error. */ | 812 | /* Out-of-memory error. */ |
| 807 | LJ_NOINLINE void lj_err_mem(lua_State *L) | 813 | LJ_NOINLINE void lj_err_mem(lua_State *L) |
| 808 | { | 814 | { |
| 815 | if (L->status == LUA_ERRERR) | ||
| 816 | lj_err_err(L); | ||
| 809 | if (L->status == LUA_ERRERR+1) /* Don't touch the stack during lua_open. */ | 817 | if (L->status == LUA_ERRERR+1) /* Don't touch the stack during lua_open. */ |
| 810 | lj_vm_unwind_c(L->cframe, LUA_ERRMEM); | 818 | lj_vm_unwind_c(L->cframe, LUA_ERRMEM); |
| 811 | if (LJ_HASJIT) { | 819 | if (LJ_HASJIT) { |
| @@ -902,6 +910,8 @@ LJ_NOINLINE void LJ_FASTCALL lj_err_run(lua_State *L) | |||
| 902 | /* Stack overflow error. */ | 910 | /* Stack overflow error. */ |
| 903 | void LJ_FASTCALL lj_err_stkov(lua_State *L) | 911 | void LJ_FASTCALL lj_err_stkov(lua_State *L) |
| 904 | { | 912 | { |
| 913 | if (L->status == LUA_ERRERR) | ||
| 914 | lj_err_err(L); | ||
| 905 | lj_debug_addloc(L, err2msg(LJ_ERR_STKOV), L->base-1, NULL); | 915 | lj_debug_addloc(L, err2msg(LJ_ERR_STKOV), L->base-1, NULL); |
| 906 | lj_err_run(L); | 916 | lj_err_run(L); |
| 907 | } | 917 | } |
diff --git a/src/lj_state.c b/src/lj_state.c index d8fc545a..3cad8cc1 100644 --- a/src/lj_state.c +++ b/src/lj_state.c | |||
| @@ -195,6 +195,7 @@ static TValue *cpluaopen(lua_State *L, lua_CFunction dummy, void *ud) | |||
| 195 | lj_meta_init(L); | 195 | lj_meta_init(L); |
| 196 | lj_lex_init(L); | 196 | lj_lex_init(L); |
| 197 | fixstring(lj_err_str(L, LJ_ERR_ERRMEM)); /* Preallocate memory error msg. */ | 197 | fixstring(lj_err_str(L, LJ_ERR_ERRMEM)); /* Preallocate memory error msg. */ |
| 198 | fixstring(lj_err_str(L, LJ_ERR_ERRERR)); /* Preallocate err in err msg. */ | ||
| 198 | g->gc.threshold = 4*g->gc.total; | 199 | g->gc.threshold = 4*g->gc.total; |
| 199 | #if LJ_HASFFI | 200 | #if LJ_HASFFI |
| 200 | lj_ctype_initfin(L); | 201 | lj_ctype_initfin(L); |
